summaryrefslogtreecommitdiffstats
path: root/src/H5FDfamily.c
Commit message (Collapse)AuthorAgeFilesLines
...
* [svn-r8383] Purpose:Quincey Koziol2004-04-181-2/+2
| | | | | | | | | | | | | Code cleanup Description: Clean up lots of warnings based on those reported from the SGI compilers as well as gcc. Platforms tested: SGI O3900, IRIX64 6.5 (Cheryl's SGI machine) FreeBSD 4.9 (sleipnir) w/ & w/o parallel h5committest
* [svn-r8134] Purpose:Quincey Koziol2004-01-311-0/+26
| | | | | | | | | | | | | | | | Code cleanup Description: Add destructor to match constructor fr VFLs when they are shut down by the library. Solution: Added H5FD_*_term() routines to "undo" changes made in H5FD_*_init() routines. Platforms tested: IBM p690 (copper) too minor to require h5committest
* [svn-r8126] Purpose:Quincey Koziol2004-01-311-1/+1
| | | | | | | | | | | | | | | | | Bug fix/optimization Description: Address slowdown in MPI-I/O file metadata operations that was introduced mid-stream. We now _require_ a POSIX compliant parallel file system for the MPI-I/O file driver (as well as for the MPI-POSIX file driver). Also optimized file open operation when the file is being created by reducing the number of collective & syncronizing calls. Additionally, refactor the MPI routines into a common place, eliminating duplicated code. Platforms tested: FreeBSD 4.9 (sleipnir) w/parallel h5committest
* [svn-r7386] Purpose:Quincey Koziol2003-08-201-141/+163
| | | | | | | | | | | | | | | Code cleanup & bug fix Description: More de-linting... Also correct a bug that lint exposed which was incrementing the incorrect driver ID of a file driver and also no saving the correct driver ID for the newly opened file. Platforms tested: FreeBSD 4.8 (sleipnir) too minor for h5committest
* [svn-r7265] *** empty log message ***Raymond Lu2003-07-261-1/+1
|
* [svn-r6501] Purpose:Bill Wendling2003-03-191-4/+17
| | | | | | | | | | | | | | New Feature Description: Added support for the lock and unlock function calls for file drivers. Only FPHDF5 uses this feature. All of these drivers don't define lock or unlock methods. Platforms tested: Linux, Modi4, Sol Misc. update:
* [svn-r6387] Purpose:Quincey Koziol2003-02-101-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | Bug Fix Description: Metadata cache in parallel I/O can cause hangs in applications which perform independent I/O on chunked datasets, because the metadata cache can attempt to flush out dirty metadata from only a single process, instead of collectively from all processes. Solution: Pass a dataset transfer property list down from every API function which could possibly trigger metadata I/O. Then, split the metadata cache into two sets of entries to allow dirty metadata to be set aside when a hash table collision occurs during independent I/O. Platforms tested: Tested h5committest {arabica (fortran), eirene (fortran, C++) modi4 (parallel, fortran)} FreeBSD 4.7 (sleipnir) serial & parallel Misc. update: Updated release_docs/RELEASE
* [svn-r6266] Purpose:Quincey Koziol2003-01-101-19/+19
| | | | | | | | | | | | Code cleanup/new feature. Description: Split FUNC_LEAVE into API and non-API specific versions. This allows a solution to compiling this branch with C++, as well as reducing the size of the binaries produced. Platforms tested: FreeBSD 4.7 (sleipnir) w/serial, parallel (including MPE) & thread-safe
* [svn-r6252] Purpose:Quincey Koziol2003-01-091-17/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Lots of performance improvements & a couple new internal API interfaces. Description: Performance Improvements: - Cached file offset & length sizes in shared file struct, to avoid constantly looking them up in the FCPL. - Generic property improvements: - Added "revision" number to generic property classes to speed up comparisons. - Changed method of storing properties from using a hash-table to the TBBT routines in the library. - Share the propery names between classes and the lists derived from them. - Removed redundant 'def_value' buffer from each property. - Switching code to use a "copy on write" strategy for properties in each list, where the properties in each list are shared with the properties in the class, until a property's value is changed in a list. - Fixed error in layout code which was allocating too many buffers. - Redefined public macros of the form (H5open()/H5check, <variable>) internally to only be (<variable>), avoiding innumerable useless calls to H5open() and H5check_version(). - Reuse already zeroed buffers in H5F_contig_fill instead of constantly re-zeroing them. - Don't write fill values if writing entire dataset. - Use gettimeofday() system call instead of time() system when checking the modification time of a dataset. - Added reference counted string API and use it for tracking the names of objects opening in a file (for the ID->name code). - Removed redundant H5P_get() calls in B-tree routines. - Redefine H5T datatype macros internally to the library, to avoid calling H5check redundantly. - Keep dataspace information for dataset locally instead of reading from disk each time. Added new module to track open objects in a file, to allow this (which will be useful eventually for some FPH5 metadata caching issues). - Remove H5AC_find macro which was inlining metadata cache lookups, and call function instead. - Remove redundant memset() calls from H5G_namei() routine. - Remove redundant checking of object type when locating objects in metadata cache and rely on the address only. - Create default dataset object to use when default dataset creation property list is used to create datasets, bypassing querying for all the property list values. - Use default I/O vector size when performing raw data with the default dataset transfer property list, instead of querying for I/O vector size. - Remove H5P_DEFAULT internally to the library, replacing it with more specific default property list based on the type of property list needed. - Remove redundant memset() calls in object header message (H5O*) routines. - Remove redunant memset() calls in data I/O routines. - Split free-list allocation routines into malloc() and calloc()- like routines, instead of one combined routine. - Remove lots of indirection in H5O*() routines. - Simplify metadata cache entry comparison routine (used when flushing entire cache out). - Only enable metadata cache statistics when H5AC_DEBUG is turned on, instead of always tracking them. - Simplify address comparison macro (H5F_addr_eq). - Remove redundant metadata cache entry protections during dataset creation by protecting the object header once and making all the modifications necessary for the dataset creation before unprotecting it. - Reduce # of "number of element in extent" computations performed by computing and storing the value during dataspace creation. - Simplify checking for group location's file information, when file has not been involving in file-mounting operations. - Use binary encoding for modification time, instead of ASCII. - Hoist H5HL_peek calls (to get information in a local heap) out of loops in many group routine. - Use static variable for iterators of selections, instead of dynamically allocation them each time. - Lookup & insert new entries in one step, avoiding traversing group's B-tree twice. - Fixed memory leak in H5Gget_objname_idx() routine (tangential to performance improvements, but fixed along the way). - Use free-list for reference counted strings. - Don't bother copying object names into cached group entries, since they are re-created when an object is opened. The benchmark I used to measure these results created several thousand small (2K) datasets in a file and wrote out the data for them. This is Elena's "regular.c" benchmark. These changes resulted in approximately ~4.3x speedup of the development branch when compared to the previous code in the development branch and ~1.4x speedup compared to the release branch. Additionally, these changes reduce the total memory used (code and data) by the development branch by ~800KB, bringing the development branch back into the same ballpark as the release branch. I'll send out a more detailed description of the benchmark results as a followup note. New internal API routines: Added "reference counted strings" API for tracking strings that get used by multiple owners without duplicating the strings. Added "ternary search tree" API for text->object mappings. Platforms tested: Tested h5committest {arabica (fortran), eirene (fortran, C++) modi4 (parallel, fortran)} Other platforms/configurations tested? FreeBSD 4.7 (sleipnir) serial & parallel Solaris 2.6 (baldric) serial
* [svn-r5951] Raymond Lu2002-09-301-3/+49
| | | | | | | | | | | Purpose: New API functions Description: Added API functions to return pointer to low-level file handle (H5Fget_vfd_handle and H5FDget_vfd_handle) and related property list setting functions(H5Pset_family_offset and H5Pset_multi_type). Platforms tested: Linux 2.2(eirene), Solaris 2.7(arabica), IRIX64 6.5(modi4)
* [svn-r5871] Purpose:Quincey Koziol2002-08-121-3/+3
| | | | | | | | | | | | | | | | Code cleanup Description: Combined H5P_isa_class and H5I_object functionality into a new internal H5P API function: H5P_object_verify, which checks that a property list is the appropriate class and then returns the property list object associated with the property list ID. This reduces the source code by about 200 LOC and trims the library binary some more. Platforms tested: FreeBSD 4.6 (sleipnir)
* [svn-r5867] Purpose:Quincey Koziol2002-08-091-5/+27
| | | | | | | | | | | | | Code cleanup Description: Changed the last HRETURN* statements in the FUNC_ENTER macros into HGOTO* macros, which reduces the size of the library binary in certain configurations by another 10% Platforms tested: FreeBSD 4.6 (sleipnir) serial & parallel, IRIX64 6.5 (modi4) serial & parallel
* [svn-r5866] Purpose:Quincey Koziol2002-08-091-3/+5
| | | | | | | | | | Code cleanup Description: Cleaned up a few warnings from compiling with --disable-hsizet on Linux Platforms tested: Linux 2.2.x (eirene)
* [svn-r5842] Purpose:Quincey Koziol2002-08-081-37/+72
| | | | | | | | | | | | | | | | Code cleanup Description: Change most (all?) HRETURN_ERROR macros to HGOTO_ERROR macros, along with HRETURN macros to HGOTO_DONE macros. This unifies the error return path from functions and reduces the size of the library by up to 10% on some platforms. Additionally, I improved a lot of the error cleanup code in many routines. Platforms tested: FreeBSD 4.6 (sleipnir) serial & parallel and IRIX64 6.5 (modi4) serial & parallel.
* [svn-r5536] Purpose:Quincey Koziol2002-06-051-0/+1
| | | | | | | | | | | | | | | | | New feature. Description: Added a "small data" block allocation mechanism to the library, similar to the mechanism used for allocating metadata currently. See the RFC for more details: http://hdf.ncsa.uiuc.edu/RFC/SmallData/SmallData.html This reduces the number of I/O operations which hit the disk for my test program from 19 to 15 (i.e. from 393 to 15, overall). Platforms tested: Solaris 2.7 (arabica) w/FORTRAN and FreeBSD 4.5 (sleipnir) w/C++
* [svn-r5484] Raymond Lu2002-05-291-14/+10
| | | | | | | | | | | | | Purpose: Bug Fixing Description: In H5FD_family_write and H5FD_family_read, size_t is checked against hsize_t for overflow, which fails on IA32 architecture machine supporting large files. Solution: Use temporary variable which won't pass the limit of size_t. Platforms tested: Linux 2.4(platinum) and IRIX64 6.5(modi4)
* [svn-r5471] Purpose:Quincey Koziol2002-05-291-18/+18
| | | | | | | | | | | | | | | | Code cleanup Description: Broke the FUNC_ENTER macro into several macros, with more specialized uses (which followup mail will describe). This was designed to move most/all of the checks which could be done at compile time to that point, instead of needlessly performing them (over & over :-) at run-time. This reduces the library's size (and thus staticly linked binaries) and has a minor speedup effect also. Platforms tested: IRIX64 6.5 (modi4) with parallel & FORTRAN enabled, and additional testing on FreeBSD and Solaris immediately after the checkin.
* [svn-r5440] Purpose:Quincey Koziol2002-05-201-3/+3
| | | | | | | | | | | New feature Description: Add 'closing' parameter to H5FDflush and VFL "flush" functions, per http://hdf.ncsa.uiuc.edu/RFC/VFLFlush/VFLFlush.html Platforms tested: IRIX64 6.5 (modi4)
* [svn-r5403] Purpose:Quincey Koziol2002-05-131-2/+2
| | | | | | | | | | Back out changes. Description: Back out changes to VFL 'flush' API function, pending review. Platforms tested: IRIX64 6.5 (modi4)
* [svn-r5393] Purpose:Quincey Koziol2002-05-101-2/+2
| | | | | | | | | | | | | | | | | | | | | | New Feature Description: The VFL flush function is called immediately before a file is closed. This can cause duplicate syncronization actions to occur, if the VFL close function also performs them. Solution: Added 'closing' parameter to VFL 'flush' operation. This allows the VFL flush function to bypass operations that will be duplicated within the VFL close function. Additionally, use the 'closing' parameter to bypass calls to MPI_File_sync() when set. Since MPI_File_close() also syncronizes the file, this avoids the terrible performance hit taken when calling MPI_File_sync() as the file is closing. Platforms tested: IRIX64 6.5 (modi4)
* [svn-r5219] Purpose:Quincey Koziol2002-04-221-1/+1
| | | | | | | | | | Code cleanup Description: Clean up warnings from gcc 3.1 Platforms tested: FreeBSD 4.5 (sleipnir)
* [svn-r4978] Purpose:Quincey Koziol2002-02-171-2/+2
| | | | | | | | Code cleanup Description: Cleanup compiler warnings found by the SGI compiler and gcc 3.0 Platforms tested: FreeBSD 4.5 w/gcc 3.0 (hack) && IRIX64 (modi4)
* [svn-r4696] Raymond Lu2001-12-111-0/+1
| | | | | | | | | | | | | | | | | Purpose: Modify H5Fclose behavior Description: The HDF5 actual file close behaves in several ways in terms of if there are still objects(dataset, group, datatype) opened in file. Solution: Added a new file access property, file close degree. It has four values, H5F_CLOSE_DEFAULT H5F_CLOSE_WEAK H5F_CLOSE_SEMI H5F_CLOSE_STRONG The way a file is closed is decided by these values. Platforms tested: IRIX64 6.5, SunOS 5.6, FreeBSD 4.4
* [svn-r4643] Purpose:Quincey Koziol2001-11-271-4/+28
| | | | | | | | | | | | | | | | | | | | | | Code cleanup Description: Windows is generating hundreds of warnings from some of the practices in the library. Mostly, they are because size_t is 32-bit and hsize_t is 64-bit on Windows and we were carelessly casting the larger values down to the smaller ones without checking for overflow. Also, some other small code cleanups,etc. Solution: Re-worked some algorithms to eliminate the casts and also added more overflow checking for assignments and function parameters which needed casts. Kent did most of the work, I just went over his changes and fit them into the the library code a bit better. Platforms tested: FreeBSD 4.4 (hawkwind)
* [svn-r4632] Purpose:Quincey Koziol2001-11-211-6/+17
| | | | | | | | Bug fix Description: Fix deep copies of property lists with H5P_DEFAULT values. Platforms tested: FreeBSD 4.4 (hawkwind)
* [svn-r4620] Purpose:Quincey Koziol2001-11-201-45/+67
| | | | | | | | | Code cleanup Description: Get rid of IDs from internal function calls and some small cleanups from the old-stype => generic property list conversion. Platforms tested: FreeBSD 4.4 (hawkwind)
* [svn-r4589] Purpose:Quincey Koziol2001-11-031-4/+5
| | | | | | | | Code cleanup Description: Clean up various compiler warnings from generic property updates. Platforms tested: FreeBSD 4.4 (hawkwind)
* [svn-r4584] Raymond Lu2001-11-021-5/+5
| | | | | | | | | Purpose: Switch from old property list to new generic property list. Description: Mainly changed H5Pcreat, H5Pclose, H5Pcopy. Platforms tested: IRIX64 6.5, FreeBSD, SunOS 5.7.
* [svn-r4569] Raymond Lu2001-10-241-9/+22
| | | | | | | | | Purpose: Generic Property List Change Description: Changed file access list to the new generic list. Platforms tested: IRIX64, SunOS5.7, FreeBSD
* [svn-r4473] Purpose:Quincey Koziol2001-09-251-1/+1
| | | | | | | | | | | | | | | | | | | | | Code cleanup for better compatibility with C++ compilers Description: C++ compilers are choking on our C code, for various reasons: we used our UNUSED macro incorrectly when referring to pointer types we used various C++ keywords as variables, etc. we incremented enum's with the ++ operator. Solution: Changed variables, etc.to avoid C++ keywords (new, class, typename, typeid, template) Fixed usage of UNUSED macro from this: char UNUSED *c to this: char * UNUSED c Switched the enums from x++ to x=x+1 Platforms tested: FreeBSD 4.4 (hawkwind)
* [svn-r4355] Purpose:Quincey Koziol2001-08-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | Code cleanup (sorta) Description: When the first versions of the HDF5 library were designed, I remembered vividly the difficulties of porting code from a 32-bit platform to a 16-bit platform and asked that people use intn & uintn instead of int & unsigned int, respectively. However, in hindsight, this was overkill and unnecessary since we weren't going to be porting the HDF5 library to 16-bit architectures. Currently, the extra uintn & intn typedefs are causing problems for users who'd like to include both the HDF5 and HDF4 header files in one source module (like Kent's h4toh5 library). Solution: Changed the uintn & intn's to unsigned and int's respectively. Platforms tested: FreeBSD 4.4 (hawkwind)
* [svn-r4181] Purpose:Quincey Koziol2001-07-101-6/+6
| | | | | | | | | Bug Fix, Code Cleanup, Code Optimization, etc. Description: Fold in the hyperslab speedups, clean up compile warnings and change a few things from using 'unsigned' or 'hsize_t' to use 'size_t' instead. Platforms tested: FreeBSD 4.3 (hawkwind), Solaris 2.7 (arabica), Irix64 6.5 (modi4)
* [svn-r3781] Purpose:Bill Wendling2001-04-051-9/+9
| | | | | | | | | | | | | | | | | | Update Description: Changed #include <hdf_file.h> construct to #include "hdf_file.h" so that the GNU compiler can more easily pick up the dependencies which it places in the .depend and Dependencies files. Also regenerated the Dependencies to go along with this. Platforms tested: Linux
* [svn-r3216] ./hdf5/src/H5FDfamily.cRobb Matzke2000-12-291-3/+4
| | | | | | | 2000-12-29 08:53:43 Robb Matzke <matzke@llnl.gov> * H5FD_family_query: The `flags' argument is advertised to be output only. Therefore I added code to zero its value before the feature bits are assigned.
* [svn-r3027] Purpose:Quincey Koziol2000-11-291-1/+1
| | | | | | | | | | | Bug fix Description: "UNUSED" macro was in wrong place for older versions of gcc Solution: Moved the "UNUSED" macro to the right of the H5FD_t type declaration and the compiler was happy... Platforms tested: Solaris X86 2.5 (hatteras)
* [svn-r3010] Purpose:Quincey Koziol2000-11-281-3/+3
| | | | | | | | | | | | | | Bug fix Description: When the v1.2 compatibility code was turned on, internal functions in the library were getting confused. Solution: Separated guts of H5Pget_driver call into an API function (the definition of which depends on the compatibility switch) and an internal function which always behaves like the v1.3/4 function. Replaced API function calls in the library code with the internal function. Platforms tested: FreeBSD 4.2 (hawkwind)
* [svn-r3008] Purpose:Quincey Koziol2000-11-281-2/+2
| | | | | | | | | | | | | | Code cleanup Description: Several places in the code were using -2 as a default value for various features. However, when a default value is returned from a function that is supposed to return negative on failure, it was causing confusion and extra work for users to check for the special value. Solution: Replaced hard-coded -2 values in the code with symbolic names, then changed symbolic names to 0 instead of -2. Platforms tested: FreeBSD 4.2 (hawkwind)
* [svn-r3005] Purpose:Quincey Koziol2000-11-271-2/+2
| | | | | | | | Backward compatibility code Description: Add in code to allow the library to emulate the v1.2 API and behavior. Platforms tested: FreeBSD 4.2 (hawkwind)
* [svn-r2811] Dan Wells2000-11-081-1/+1
| | | | | | | | | | | | Purpose: Bug fix. Description: The names of some entries did not correspond with the names in the FUNC_ENTER macro. This would cause inaccuracies during Pablo tracing. Solution: The names were changed in FUNC_ENTER to agree with the entry names. Platforms tested: Solaris, Irix, AIX, HP Vclass
* [svn-r2722] Purpose:Quincey Koziol2000-10-241-3/+3
| | | | | | | | | | Feature symmetry Description: A while ago I needed to get the 'type' of data being accessed during writes to the VFL driver, so I put in code to get the information down there. Albert asked for the same information during reads, so I've added that in. Tested: FreeBSD 4.1.1 (hawkwind)
* [svn-r2652] Purpose:Quincey Koziol2000-10-101-0/+1
| | | | | | | | | | | | | | | Maintainance & performance enhancements Description: Re-arranged header files to protect private symbols better. Changed optimized regular hyperslab I/O to compute the offsets more efficiently from previous method of using matrix operations. Added sequential I/O operations at a more abstract level (at the same level as H5F_arr_read/write), to support the optimized hyperslab I/O. Platforms tested: Solaris 2.6 (baldric) & FreeBSD 4.1.1 (hawkwind)
* [svn-r2600] Purpose:Quincey Koziol2000-09-261-0/+1
| | | | | | | | | | | Implemented new feature Description: Added data sieve buffering code to raw I/O data path. This is enabled for all the VFL drivers except the mpio & core drivers. Also added two new API functions to control the sieve buffer size: H5Pset_sieve_buf_size() and H5Pget_sieve_buf_size(). Platforms tested: Solaris 2.6 (i.e. baldric)
* [svn-r2579] Purpose:Quincey Koziol2000-09-191-2/+1
| | | | | | Clean up small compiler warnings and add missing function prototypes. Platforms tested: FreeBSD 4.1
* [svn-r2498] Added new VFL 'query' code and added new 'type of data' ↵Quincey Koziol2000-08-311-3/+40
| | | | | | parameter to write call.
* [svn-r1802] Changes since 19991019Robb Matzke1999-11-011-14/+26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ---------------------- ./MANIFEST ./configure.in ./configure [REGENERATED] Added more checking for `make' features. ./Makefile.in ./doc/Makefile.in ./doc/html/Makefile.in ./doc/html/Tutor/Makefile.in ./examples/Makefile.in ./pablo/Makefile.in ./src/Makefile.in ./test/Makefile.in ./testpar/Makefile.in ./tools/Makefile.in ./config/commence.in ./config/conclude.in ./config/depend.in [REMOVED] ./config/depend1.in [NEW] ./config/depend2.in [NEW] ./config/depend3.in [NEW] ./config/depend4.in [NEW] ./config/dependN.in [NEW] The directory search stuff was moved into commence.in, thereby shortening the Makefile.in prologues. ./doc/html/Dependencies [NEW] ./doc/html/Tutor/Dependencies [NEW] ./examples/Dependencies [NEW] ./src/Dependencies [NEW] ./test/Dependencies [NEW] ./testpar/Dependencies [NEW] ./tools/Dependencies [NEW] The `.distdep' files were all renamed to `Dependencies' to make them more obvious. They are required (but may be empty) in every directory that has a Makefile.in that ends with @CONCLUDE@ (you'll get an obvious error from make if you forgot to create one). ./bin/trace ./src/H5.c Added H5E_major_t and H5E_minor_t although tracing only prints the integer value. ./src/H5E.c ./src/H5Epublic.h Added tracing information. ./src/H5FDcore.c ./src/H5FDfamily.c ./src/H5FDgass.c ./src/H5FDmpio.c ./src/H5FDsec2.c ./src/H5FDstdio.c Fixed places where FUNC_LEAVE() evaluated it's argument more than once. Added tracing information. Wrapped long lines. ./config/gnu-flags Fixed a syntax error when we don't have a gnu compiler.
* [svn-r1788] Converted all the VFL drivers except for the stdio and multi ↵Quincey Koziol1999-10-231-165/+253
| | | | | | drivers back into the "internal" HDF5 coding standard.
* [svn-r1759] Corrected a few more compiler warnings.Quincey Koziol1999-10-151-1/+1
|
* [svn-r1585] Changes since 19990820Robb Matzke1999-08-241-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ---------------------- ./src/H5D.c Added additional elements to a variable initializer in H5Dvlen_get_buf_size() to shut up a warning message. Also added the API tracing call. ./src/H5F.c Added file opening optimizations. If the driver doesn't support the ability to determine when two file handles refer to the same file (like MPIO and GASS) then H5F_open() makes fewer calls to the driver's open callback. Also, if the tentative file access flags are the same as the original flags then H5F_open() makes fewer calls to the file device. ./src/H5FD.c ./src/H5FDprivate.h ./src/H5FDpublic.h Added H5FD_get_class() so the library can get information about what file driver callbacks are defined. This will be useful when more optimization functions are added to the VFL, such as for MPIO derived datatype I/O. ./src/H5FDcore.c ./src/H5FDfamily.c ./src/H5FDmpio.c ./src/H5FDmulti.c ./src/H5FDsec2.c The driver symbols (like H5FD_CORE, etc) are actually function calls. The functions were fixed to return correct values even after calling H5close(). ./src/H5FDmulti.c ./src/H5FDmulti.h Added support for opening a file when parts are missing (only if the caller explicitly allows that in the file access property list). Moved some common code sequences into macros or functions. Added better support for reopening files. All the application has to know is that the file is a multi file and the base name from which all the member names are created. More debugging output when the file is opened with the H5F_ACC_DEBUG flag. Fixed various bugs. ./src/H5Fistore.c Chunked raw data was accidently allocated as meta data instead of raw data. ./src/H5I.c The H5Iget_type() function fails when invoked with an old object ID (an ID which has been closed down). ./test/h5test.c Added an extra argument when setting the multi file access property lists so the test fails if it can't open one of the sub-files. ./tools/h5ls.c Improved the algorithm for deciding what file driver to use. It basically tries all of the predefined drivers and is now able to open family, split, and multi files without looking for special characters in the file name. Added `-e' and `--errors' switches which cause errors from libhdf5 to be reported on stderr in addition to the simple error message displayed by h5ls.
* [svn-r1572] Changes since 19990810Robb Matzke1999-08-171-2/+42
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ---------------------- ./MANIFEST ./src/H5FDmulti.c [NEW] ./src/H5FDmulti.h [NEW] ./src/Makefile.in ./src/hdf5.h The split driver was reimplemented as a more general "multi" driver which is capable of splitting data into multiple files like the family driver except the partioning is done by memory usage type instead of address. The H5Pset_fapl_split() function just calls H5Pset_fapl_multi() with arguments which prepare to split the address space into two files: meta and raw data. This is the first version. I plan to allow the open() call to relax a bit which would allow one to open an hdf5 file when only the meta-data file is present. This would allow a very large file to be split and stored on tape and the relatively small meta file to be mirrored on disk to allow limited browsing of the file (any request for raw data would fail). ./src/H5private.h ./src/H5F.c ./src/H5FD.c ./src/H5FDprivate.h ./src/H5FDpublic.h ./src/H5FDcore.c ./src/H5FDfamily.c ./src/H5FDmpio.c ./src/H5FDsec2.c Added the ability for a file driver to store information in the superblock which would be needed if the file were opened again later for reading. The format is driver-defined which allows users to extend it however they like. ./doc/html/H5.format.html Added information about the new driver information block of the superblock. This is where file drivers store information they need in order to reopen the file later. ./src/H5F.c ./src/H5Fprivate.h ./src/H5FD.c ./src/H5FDprivate.h ./src/H5FDpublic.h ./src/H5FDcore.c ./src/H5FDfamily.c ./src/H5FDmpio.c ./src/H5FDsec2.c ./src/H5Fistore.c ./src/H5R.c The file access properties and the file access property list were decoupled, which allows the property list to more cleanly contain properties for various levels of the file and which allows the property list to be modified more cleanly when opening files. ./src/H5.c ./src/H5FDpublic.h Removed H5FD_MEM_META and H5FD_MEM_GROUP since they're never used. ./src/H5D.c Changed the way we detect the MPIO driver in all these special cases. ./src/H5F.c ./src/H5Rpublic.h ./test/tfile.c The default file sizeof(offset) was changed to be a function of haddr_t instead of hsize_t. THE H5RPUBLIC.H DEFINITIONS WILL HAVE PROBLEMS IF THE USER CREATES A FILE WITH NON-DEFAULT OFFSET AND SIZE SIZES! ./src/H5F.c Fixed an uninitialized memory access bug in file closing related to the VFL. ./src/H5T.c ./src/H5Tpublic.h Added an H5T_NATIVE_HADDR predefined datatype which corresponds to the `haddr_t' type. ./test/Makefile.in Reformatted long lines. ./test/big.c ./test/cmpd_dset.c ./test/dsets.c ./test/dtypes.c ./test/extend.c ./test/external.c Removed the H5F_ACC_DEBUG flag from file creation/open calls. ./test/big.c Plugged a memory leak. ./test/h5test.c Added support for the `multi' driver. Removed #warning about not having the stdio driver. Plans are to not implement it since the sec2 driver serves the same purpose and testing didn't show any difference in execution times between the two.
* [svn-r1568] Changes since 19990730Robb Matzke1999-08-101-0/+777
---------------------- This extensive change is the virtual file layer implementation. I've ported and tested the sec2, family, and core drivers and only ported the mpio driver (Albert will test it). So if you need MPIO I would recommend sticking with the previous version for a while. You will get a few compile warnings about split and stdio drivers not being implemented and possibly tracing information not inserted in some of the drivers. You can safely ignore them but I plan to fix them. I'm still working on the split driver because I just realized that it needs a part of the VFL that isn't written yet. Documentation is being updated also because there were some minor changes (mostly just name changes). It should be available on my web site later this week. ./MANIFEST ./src/Makefile.in ./src/hdf5.h ./src/H5Flow.c [REMOVED] ./src/H5Fstdio.c [REMOVED] ./src/H5Fsec2.c [REMOVED] ./src/H5Fsplit.c [REMOVED] ./src/H5Fmpio.c [REMOVED] ./src/H5Ffamily.c [REMOVED] ./src/H5Fcore.c [REMOVED] ./src/H5MFpublic.h [REMOVED] ./src/H5FD.c [NEW] ./src/H5FDcore.c [NEW] ./src/H5FDcore.h [NEW] ./src/H5FDfamily.c [NEW] ./src/H5FDfamily.h [NEW] ./src/H5FDmpio.c [NEW] ./src/H5FDmpio.h [NEW] ./src/H5FDprivate.h [NEW] ./src/H5FDpublic.h [NEW] ./src/H5FDsec2.c [NEW] ./src/H5FDsec2.h [NEW] Removed/added files for virtual file layer. ./bin/trace ./src/H5.c Removed unused public datatypes and added new VFL public datatypes. Changed an error message. ./config/BlankForm ./config/dec-flags ./config/gnu-flags ./config/hpux10.20 ./config/hpux9.03 ./config/irix5.x ./config/irix6.x ./config/solaris2.x ./config/unicosmk Removed the H5F_OPT_SEEK and H5F_LOW_DFLT constants from the configuration since they're no longer applicable. The default file driver is always the sec2 driver and it always optimizes calls to lseek() or lseek64(). ./config/depend.in C preprocessor errors generated during automatic dependency building are sent to /dev/null to prevent them from appearing twice in the make output. ./src/H5AC.c ./src/H5B.c ./src/H5D.c ./src/H5F.c ./src/H5G.c ./src/H5Gent.c ./src/H5Gnode.c ./src/H5HG.c ./src/H5HL.c ./src/H5O.c ./src/H5Oattr.c ./src/H5Odtype.c ./src/H5Oefl.c ./src/H5Oshared.c ./src/H5T.c ./src/H5detect.c ./test/ohdr.c Changed H5F_ADDR_UNDEF to HADDR_UNDEF to be more consistent with the `haddr_t' datatype which is now a public type. ./src/H5D.c ./src/H5P.c ./src/H5Ppublic.h ./src/H5Tconv.c ./test/cmpd_dset.c ./test/dsets.c ./test/overhead.c ./test/tselect.c ./test/tvltypes.c The H5P_DATASET_XFER constant was changed to H5P_DATA_XFER because the properties apply to all types of I/O operations, not just datasets. ./src/H5B.c ./src/H5Bprivate.h ./src/H5D.c ./src/H5Dpublic.h ./src/H5F.c ./src/H5Farray.c ./src/H5Fistore.c ./src/H5Fprivate.h ./src/H5Fpublic.h ./src/H5Gnode.c ./src/H5Gpkg.h ./src/H5HG.c ./src/H5HL.c ./src/H5O.c ./src/H5R.c ./src/H5Sall.c ./src/H5Shyper.c ./src/H5Smpio.c ./src/H5Spoint.c ./src/H5Sprivate.h ./test/big.c ./test/h5test.c ./test/istore.c ./testpar/t_dset.c ./testpar/t_file.c ./tools/h5debug.c ./tools/h5ls.c Modified to work with the virtual file layer by calling H5FD_* functions instead of H5F_low_* functions and by passing file access and data transfer properties by object ID instead of pointer. Changed H5D_transfer_t to H5FD_mpio_xfer_t since the COLLECTIVE vs. INDEPENDENT transfer mode is specific to the MPIO file driver. Moved MPIO-specific stuff into the MPIO driver. ./src/H5B.c ./src/H5D.c ./src/H5Fprivate.h The H5F_mpio_* private functions were renamed and placed in the H5FDmpio driver except those which appeared in H5Smpio.c. ./src/H5E.c ./src/H5Epublic.h Added major error number H5E_VFL for virtual file layer related errors. ./src/H5F.c ./src/H5Fprivate.h Changed the logic that controls whether the boot block is written. Instead of assuming that the first call to write the boot block is only to allocate space, I've added a function argument which makes this explicit. Changed the way files are compared so that a driver-defined comparison function can be called. Files which belong to different drivers are always considered different. Removed H5F_driver_t since file drivers are now identified by object ID instead of a special non-user-extendible datatype. Removed all the hard-coded low-level file properties which have been replaced by the various file drivers. ./src/H5I.c ./src/H5Iprivate.h Added the H5I_inc_ref() which was removed a few months ago since we finally have a use for it. ./src/H5Ipublic.h Added the H5I_VFL object ID type to identify file drivers in the virtual file layer. ./src/H5MF.c ./src/H5MFprivate.h Moved all the allocation/deallocation code into the virtual file layer which allows file drivers to override much of it. ./src/H5P.c ./src/H5Ppublic.h Moved file driver-specific code into the various file driver files. The H5Pcopy() and H5Pclose() functions make calls into the virtual file driver to manage the memory for driver-specific file access and data transfer properties. ./src/H5private.h ./src/H5public.h The `haddr_t' type is now public. ./test/tfile.c Added a few more comments.
: $(SOURCE_PATH)\src\script\qscriptecmadate.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmadate.cpp
-
-qscriptecmafunction.obj: $(SOURCE_PATH)\src\script\qscriptecmafunction.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmafunction.cpp
-
-qscriptecmaglobal.obj: $(SOURCE_PATH)\src\script\qscriptecmaglobal.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmaglobal.cpp
-
-qscriptecmamath.obj: $(SOURCE_PATH)\src\script\qscriptecmamath.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmamath.cpp
-
-qscriptecmanumber.obj: $(SOURCE_PATH)\src\script\qscriptecmanumber.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmanumber.cpp
-
-qscriptecmaobject.obj: $(SOURCE_PATH)\src\script\qscriptecmaobject.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmaobject.cpp
-
-qscriptecmaregexp.obj: $(SOURCE_PATH)\src\script\qscriptecmaregexp.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmaregexp.cpp
-
-qscriptecmastring.obj: $(SOURCE_PATH)\src\script\qscriptecmastring.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmastring.cpp
-
-qscriptecmaerror.obj: $(SOURCE_PATH)\src\script\qscriptecmaerror.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmaerror.cpp
-
-qscriptcontext_p.obj: $(SOURCE_PATH)\src\script\qscriptcontext_p.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptcontext_p.cpp
-
-qscriptengine.obj: $(SOURCE_PATH)\src\script\qscriptengine.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptengine.cpp
-
-qscriptengine_p.obj: $(SOURCE_PATH)\src\script\qscriptengine_p.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptengine_p.cpp
-
-qscriptengineagent.obj: $(SOURCE_PATH)\src\script\qscriptengineagent.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptengineagent.cpp
-
-qscriptextenumeration.obj: $(SOURCE_PATH)\src\script\qscriptextenumeration.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptextenumeration.cpp
-
-qscriptextvariant.obj: $(SOURCE_PATH)\src\script\qscriptextvariant.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptextvariant.cpp
-
-qscriptcontext.obj: $(SOURCE_PATH)\src\script\qscriptcontext.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptcontext.cpp
-
-qscriptcontextinfo.obj: $(SOURCE_PATH)\src\script\qscriptcontextinfo.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptcontextinfo.cpp
-
-qscriptfunction.obj: $(SOURCE_PATH)\src\script\qscriptfunction.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptfunction.cpp
-
-qscriptgrammar.obj: $(SOURCE_PATH)\src\script\qscriptgrammar.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptgrammar.cpp
-
-qscriptlexer.obj: $(SOURCE_PATH)\src\script\qscriptlexer.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptlexer.cpp
-
-qscriptclassdata.obj: $(SOURCE_PATH)\src\script\qscriptclassdata.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptclassdata.cpp
-
-qscriptparser.obj: $(SOURCE_PATH)\src\script\qscriptparser.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptparser.cpp
-
-qscriptprettypretty.obj: $(SOURCE_PATH)\src\script\qscriptprettypretty.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptprettypretty.cpp
-
-qscriptsyntaxchecker.obj: $(SOURCE_PATH)\src\script\qscriptsyntaxchecker.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptsyntaxchecker.cpp
-
-qscriptstring.obj: $(SOURCE_PATH)\src\script\qscriptstring.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptstring.cpp
-
-qscriptclass.obj: $(SOURCE_PATH)\src\script\qscriptclass.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptclass.cpp
-
-qscriptclasspropertyiterator.obj: $(SOURCE_PATH)\src\script\qscriptclasspropertyiterator.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptclasspropertyiterator.cpp
-
-qscriptvalue.obj: $(SOURCE_PATH)\src\script\qscriptvalue.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptvalue.cpp
-
-qscriptvalueimpl.obj: $(SOURCE_PATH)\src\script\qscriptvalueimpl.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptvalueimpl.cpp
-
-qscriptvalueiterator.obj: $(SOURCE_PATH)\src\script\qscriptvalueiterator.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptvalueiterator.cpp
-
-qscriptvalueiteratorimpl.obj: $(SOURCE_PATH)\src\script\qscriptvalueiteratorimpl.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptvalueiteratorimpl.cpp
diff --git a/qmake/Makefile.win32-g++ b/qmake/Makefile.win32-g++
index 229a456..8a65697 100644
--- a/qmake/Makefile.win32-g++
+++ b/qmake/Makefile.win32-g++
@@ -81,45 +81,7 @@ QTOBJS= \
qsettings_win.o \
qvariant.o \
qmetatype.o \
- qnumeric.o \
- qscriptasm.o \
- qscriptast.o \
- qscriptastvisitor.o \
- qscriptcompiler.o \
- qscriptecmaarray.o \
- qscriptecmaboolean.o \
- qscriptecmacore.o \
- qscriptecmadate.o \
- qscriptecmafunction.o \
- qscriptecmaglobal.o \
- qscriptecmamath.o \
- qscriptecmanumber.o \
- qscriptecmaobject.o \
- qscriptecmaregexp.o \
- qscriptecmastring.o \
- qscriptecmaerror.o \
- qscriptcontext_p.o \
- qscriptengine.o \
- qscriptengine_p.o \
- qscriptengineagent.o \
- qscriptextenumeration.o \
- qscriptextvariant.o \
- qscriptcontext.o \
- qscriptcontextinfo.o \
- qscriptfunction.o \
- qscriptgrammar.o \
- qscriptlexer.o \
- qscriptclassdata.o \
- qscriptparser.o \
- qscriptprettypretty.o \
- qscriptsyntaxchecker.o \
- qscriptclass.o \
- qscriptclasspropertyiterator.o \
- qscriptstring.o \
- qscriptvalue.o \
- qscriptvalueimpl.o \
- qscriptvalueiterator.o \
- qscriptvalueiteratorimpl.o
+ qnumeric.o
qmake.exe: $(OBJS) $(QTOBJS)
@@ -323,117 +285,3 @@ metamakefile.o: $(SOURCE_PATH)/qmake/generators/metamakefile.cpp
xmloutput.o: $(SOURCE_PATH)/qmake/generators/xmloutput.cpp
$(CXX) $(CXXFLAGS) generators/xmloutput.cpp
-
-qscriptasm.o: $(SOURCE_PATH)\src\script\qscriptasm.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptasm.cpp
-
-qscriptast.o: $(SOURCE_PATH)\src\script\qscriptast.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptast.cpp
-
-qscriptastvisitor.o: $(SOURCE_PATH)\src\script\qscriptastvisitor.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptastvisitor.cpp
-
-qscriptcompiler.o: $(SOURCE_PATH)\src\script\qscriptcompiler.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptcompiler.cpp
-
-qscriptecmaarray.o: $(SOURCE_PATH)\src\script\qscriptecmaarray.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmaarray.cpp
-
-qscriptecmaboolean.o: $(SOURCE_PATH)/src/script/qscriptecmaboolean.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaboolean.cpp
-
-qscriptecmacore.o: $(SOURCE_PATH)/src/script/qscriptecmacore.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmacore.cpp
-
-qscriptecmadate.o: $(SOURCE_PATH)/src/script/qscriptecmadate.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmadate.cpp
-
-qscriptecmafunction.o: $(SOURCE_PATH)/src/script/qscriptecmafunction.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmafunction.cpp
-
-qscriptecmaglobal.o: $(SOURCE_PATH)/src/script/qscriptecmaglobal.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaglobal.cpp
-
-qscriptecmamath.o: $(SOURCE_PATH)/src/script/qscriptecmamath.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmamath.cpp
-
-qscriptecmanumber.o: $(SOURCE_PATH)/src/script/qscriptecmanumber.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmanumber.cpp
-
-qscriptecmaobject.o: $(SOURCE_PATH)/src/script/qscriptecmaobject.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaobject.cpp
-
-qscriptecmaregexp.o: $(SOURCE_PATH)/src/script/qscriptecmaregexp.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaregexp.cpp
-
-qscriptecmastring.o: $(SOURCE_PATH)/src/script/qscriptecmastring.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmastring.cpp
-
-qscriptecmaerror.o: $(SOURCE_PATH)/src/script/qscriptecmaerror.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaerror.cpp
-
-qscriptcontext_p.o: $(SOURCE_PATH)/src/script/qscriptcontext_p.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptcontext_p.cpp
-
-qscriptengine.o: $(SOURCE_PATH)/src/script/qscriptengine.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptengine.cpp
-
-qscriptengine_p.o: $(SOURCE_PATH)/src/script/qscriptengine_p.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptengine_p.cpp
-
-qscriptengineagent.o: $(SOURCE_PATH)/src/script/qscriptengineagent.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptengineagent.cpp
-
-qscriptextenumeration.o: $(SOURCE_PATH)/src/script/qscriptextenumeration.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptextenumeration.cpp
-
-qscriptextvariant.o: $(SOURCE_PATH)/src/script/qscriptextvariant.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptextvariant.cpp
-
-qscriptcontext.o: $(SOURCE_PATH)/src/script/qscriptcontext.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptcontext.cpp
-
-qscriptcontextinfo.o: $(SOURCE_PATH)/src/script/qscriptcontextinfo.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptcontextinfo.cpp
-
-qscriptfunction.o: $(SOURCE_PATH)/src/script/qscriptfunction.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptfunction.cpp
-
-qscriptgrammar.o: $(SOURCE_PATH)/src/script/qscriptgrammar.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptgrammar.cpp
-
-qscriptlexer.o: $(SOURCE_PATH)/src/script/qscriptlexer.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptlexer.cpp
-
-qscriptclassdata.o: $(SOURCE_PATH)/src/script/qscriptclassdata.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptclassdata.cpp
-
-qscriptparser.o: $(SOURCE_PATH)/src/script/qscriptparser.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptparser.cpp
-
-qscriptprettypretty.o: $(SOURCE_PATH)/src/script/qscriptprettypretty.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptprettypretty.cpp
-
-qscriptsyntaxchecker.o: $(SOURCE_PATH)/src/script/qscriptsyntaxchecker.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptsyntaxchecker.cpp
-
-qscriptclass.o: $(SOURCE_PATH)/src/script/qscriptclass.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptclass.cpp
-
-qscriptclasspropertyiterator.o: $(SOURCE_PATH)/src/script/qscriptclasspropertyiterator.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptclasspropertyiterator.cpp
-
-qscriptstring.o: $(SOURCE_PATH)/src/script/qscriptstring.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptstring.cpp
-
-qscriptvalue.o: $(SOURCE_PATH)/src/script/qscriptvalue.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptvalue.cpp
-
-qscriptvalueimpl.o: $(SOURCE_PATH)/src/script/qscriptvalueimpl.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptvalueimpl.cpp
-
-qscriptvalueiterator.o: $(SOURCE_PATH)/src/script/qscriptvalueiterator.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptvalueiterator.cpp
-
-qscriptvalueiteratorimpl.o: $(SOURCE_PATH)/src/script/qscriptvalueiteratorimpl.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptvalueiteratorimpl.cpp
diff --git a/qmake/Makefile.win32-g++-sh b/qmake/Makefile.win32-g++-sh
index 3f1b1df..eea7f18 100644
--- a/qmake/Makefile.win32-g++-sh
+++ b/qmake/Makefile.win32-g++-sh
@@ -81,45 +81,7 @@ QTOBJS= \
qsettings_win.o \
qvariant.o \
qmetatype.o \
- qnumeric.o \
- qscriptasm.o \
- qscriptast.o \
- qscriptastvisitor.o \
- qscriptcompiler.o \
- qscriptecmaarray.o \
- qscriptecmaboolean.o \
- qscriptecmacore.o \
- qscriptecmadate.o \
- qscriptecmafunction.o \
- qscriptecmaglobal.o \
- qscriptecmamath.o \
- qscriptecmanumber.o \
- qscriptecmaobject.o \
- qscriptecmaregexp.o \
- qscriptecmastring.o \
- qscriptecmaerror.o \
- qscriptcontext_p.o \
- qscriptengine.o \
- qscriptengine_p.o \
- qscriptengineagent.o \
- qscriptextenumeration.o \
- qscriptextvariant.o \
- qscriptcontext.o \
- qscriptcontextinfo.o \
- qscriptfunction.o \
- qscriptgrammar.o \
- qscriptlexer.o \
- qscriptclassdata.o \
- qscriptparser.o \
- qscriptprettypretty.o \
- qscriptsyntaxchecker.o \
- qscriptclass.o \
- qscriptclasspropertyiterator.o \
- qscriptstring.o \
- qscriptvalue.o \
- qscriptvalueimpl.o \
- qscriptvalueiterator.o \
- qscriptvalueiteratorimpl.o
+ qnumeric.o
qmake.exe: $(OBJS) $(QTOBJS)
$(LINKQMAKE)
@@ -322,117 +284,3 @@ metamakefile.o: $(SOURCE_PATH)/qmake/generators/metamakefile.cpp
xmloutput.o: $(SOURCE_PATH)/qmake/generators/xmloutput.cpp
$(CXX) $(CXXFLAGS) generators/xmloutput.cpp
-
-qscriptasm.o: $(SOURCE_PATH)\src\script\qscriptasm.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptasm.cpp
-
-qscriptast.o: $(SOURCE_PATH)\src\script\qscriptast.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptast.cpp
-
-qscriptastvisitor.o: $(SOURCE_PATH)\src\script\qscriptastvisitor.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptastvisitor.cpp
-
-qscriptcompiler.o: $(SOURCE_PATH)\src\script\qscriptcompiler.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptcompiler.cpp
-
-qscriptecmaarray.o: $(SOURCE_PATH)\src\script\qscriptecmaarray.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\script\qscriptecmaarray.cpp
-
-qscriptecmaboolean.o: $(SOURCE_PATH)/src/script/qscriptecmaboolean.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaboolean.cpp
-
-qscriptecmacore.o: $(SOURCE_PATH)/src/script/qscriptecmacore.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmacore.cpp
-
-qscriptecmadate.o: $(SOURCE_PATH)/src/script/qscriptecmadate.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmadate.cpp
-
-qscriptecmafunction.o: $(SOURCE_PATH)/src/script/qscriptecmafunction.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmafunction.cpp
-
-qscriptecmaglobal.o: $(SOURCE_PATH)/src/script/qscriptecmaglobal.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaglobal.cpp
-
-qscriptecmamath.o: $(SOURCE_PATH)/src/script/qscriptecmamath.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmamath.cpp
-
-qscriptecmanumber.o: $(SOURCE_PATH)/src/script/qscriptecmanumber.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmanumber.cpp
-
-qscriptecmaobject.o: $(SOURCE_PATH)/src/script/qscriptecmaobject.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaobject.cpp
-
-qscriptecmaregexp.o: $(SOURCE_PATH)/src/script/qscriptecmaregexp.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaregexp.cpp
-
-qscriptecmastring.o: $(SOURCE_PATH)/src/script/qscriptecmastring.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmastring.cpp
-
-qscriptecmaerror.o: $(SOURCE_PATH)/src/script/qscriptecmaerror.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptecmaerror.cpp
-
-qscriptcontext_p.o: $(SOURCE_PATH)/src/script/qscriptcontext_p.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptcontext_p.cpp
-
-qscriptengine.o: $(SOURCE_PATH)/src/script/qscriptengine.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptengine.cpp
-
-qscriptengine_p.o: $(SOURCE_PATH)/src/script/qscriptengine_p.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptengine_p.cpp
-
-qscriptengineagent.o: $(SOURCE_PATH)/src/script/qscriptengineagent.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptengineagent.cpp
-
-qscriptextenumeration.o: $(SOURCE_PATH)/src/script/qscriptextenumeration.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptextenumeration.cpp
-
-qscriptextvariant.o: $(SOURCE_PATH)/src/script/qscriptextvariant.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptextvariant.cpp
-
-qscriptcontext.o: $(SOURCE_PATH)/src/script/qscriptcontext.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptcontext.cpp
-
-qscriptcontextinfo.o: $(SOURCE_PATH)/src/script/qscriptcontextinfo.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptcontextinfo.cpp
-
-qscriptfunction.o: $(SOURCE_PATH)/src/script/qscriptfunction.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptfunction.cpp
-
-qscriptgrammar.o: $(SOURCE_PATH)/src/script/qscriptgrammar.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptgrammar.cpp
-
-qscriptlexer.o: $(SOURCE_PATH)/src/script/qscriptlexer.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptlexer.cpp
-
-qscriptclassdata.o: $(SOURCE_PATH)/src/script/qscriptclassdata.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptclassdata.cpp
-
-qscriptparser.o: $(SOURCE_PATH)/src/script/qscriptparser.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptparser.cpp
-
-qscriptprettypretty.o: $(SOURCE_PATH)/src/script/qscriptprettypretty.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptprettypretty.cpp
-
-qscriptsyntaxchecker.o: $(SOURCE_PATH)/src/script/qscriptsyntaxchecker.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptsyntaxchecker.cpp
-
-qscriptclass.o: $(SOURCE_PATH)/src/script/qscriptclass.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptclass.cpp
-
-qscriptclasspropertyiterator.o: $(SOURCE_PATH)/src/script/qscriptclasspropertyiterator.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptclasspropertyiterator.cpp
-
-qscriptstring.o: $(SOURCE_PATH)/src/script/qscriptstring.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptstring.cpp
-
-qscriptvalue.o: $(SOURCE_PATH)/src/script/qscriptvalue.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptvalue.cpp
-
-qscriptvalueimpl.o: $(SOURCE_PATH)/src/script/qscriptvalueimpl.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptvalueimpl.cpp
-
-qscriptvalueiterator.o: $(SOURCE_PATH)/src/script/qscriptvalueiterator.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptvalueiterator.cpp
-
-qscriptvalueiteratorimpl.o: $(SOURCE_PATH)/src/script/qscriptvalueiteratorimpl.cpp
- $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/src/script/qscriptvalueiteratorimpl.cpp
diff --git a/qmake/project.h b/qmake/project.h
index 1e2b754..7bc3709 100644
--- a/qmake/project.h
+++ b/qmake/project.h
@@ -50,7 +50,7 @@
#include <qmetatype.h>
#ifndef QT_BUILD_QMAKE_LIBRARY
-# define QTSCRIPT_SUPPORT
+//# define QTSCRIPT_SUPPORT
#endif
#ifdef QTSCRIPT_SUPPORT
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSImmediate.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSImmediate.h
index 706396e..e5d19e0 100644
--- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSImmediate.h
+++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSImmediate.h
@@ -130,7 +130,7 @@ namespace JSC {
*/
class JSImmediate {
- private:
+ public: // ### we need it!
friend class JIT;
friend class JSValue;
friend class JSFastMath;
diff --git a/src/script/api/api.pri b/src/script/api/api.pri
new file mode 100644
index 0000000..17ec9b6
--- /dev/null
+++ b/src/script/api/api.pri
@@ -0,0 +1,32 @@
+SOURCES += \
+ $$PWD/qscriptclass.cpp \
+ $$PWD/qscriptclasspropertyiterator.cpp \
+ $$PWD/qscriptcontext.cpp \
+ $$PWD/qscriptcontextinfo.cpp \
+ $$PWD/qscriptengine.cpp \
+ $$PWD/qscriptengineagent.cpp \
+ $$PWD/qscriptextensionplugin.cpp \
+ $$PWD/qscriptstring.cpp \
+ $$PWD/qscriptvalue.cpp \
+ $$PWD/qscriptvalueiterator.cpp \
+ $$PWD/qscriptable.cpp
+
+HEADERS += \
+ $$PWD/qscriptclass.h \
+ $$PWD/qscriptclasspropertyiterator.h \
+ $$PWD/qscriptcontext.h \
+ $$PWD/qscriptcontext_p.h \
+ $$PWD/qscriptcontextinfo.h \
+ $$PWD/qscriptengine.h \
+ $$PWD/qscriptengine_p.h \
+ $$PWD/qscriptengineagent.h \
+ $$PWD/qscriptengineagent_p.h \
+ $$PWD/qscriptextensioninterface.h \
+ $$PWD/qscriptextensionplugin.h \
+ $$PWD/qscriptstring.h \
+ $$PWD/qscriptstring_p.h \
+ $$PWD/qscriptvalue.h \
+ $$PWD/qscriptvalue_p.h \
+ $$PWD/qscriptvalueiterator.h \
+ $$PWD/qscriptable.h \
+ $$PWD/qscriptable_p.h
diff --git a/src/script/qscriptable.cpp b/src/script/api/qscriptable.cpp
index a6401d6..c2aa6b3 100644
--- a/src/script/qscriptable.cpp
+++ b/src/script/api/qscriptable.cpp
@@ -1,55 +1,21 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
#ifndef QT_NO_QOBJECT
#include "qscriptable.h"
-
-#ifndef QT_NO_SCRIPT
-
#include "qscriptable_p.h"
-
#include "qscriptengine.h"
-#include "qscriptcontext.h"
-#include "qscriptvalue.h"
+
+#ifndef QT_NO_SCRIPT
QT_BEGIN_NAMESPACE
diff --git a/src/script/api/qscriptable.h b/src/script/api/qscriptable.h
new file mode 100644
index 0000000..f7ccb7b
--- /dev/null
+++ b/src/script/api/qscriptable.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTABLE_H
+#define QSCRIPTABLE_H
+
+#include <QtCore/qobjectdefs.h>
+
+#ifndef QT_NO_SCRIPT
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Script)
+
+#ifndef QT_NO_QOBJECT
+
+class QScriptEngine;
+class QScriptContext;
+class QScriptValue;
+
+class QScriptablePrivate;
+
+class Q_SCRIPT_EXPORT QScriptable
+{
+public:
+ QScriptable();
+ ~QScriptable();
+
+ QScriptEngine *engine() const;
+ QScriptContext *context() const;
+ QScriptValue thisObject() const;
+ int argumentCount() const;
+ QScriptValue argument(int index) const;
+
+private:
+ QScriptablePrivate *d_ptr;
+
+ Q_DISABLE_COPY(QScriptable)
+ Q_DECLARE_PRIVATE(QScriptable)
+};
+
+#endif // QT_NO_QOBJECT
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_SCRIPT
+#endif // QSCRIPTABLE_H
diff --git a/src/script/api/qscriptable_p.h b/src/script/api/qscriptable_p.h
new file mode 100644
index 0000000..68958d0
--- /dev/null
+++ b/src/script/api/qscriptable_p.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTABLE_P_H
+#define QSCRIPTABLE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qobjectdefs.h>
+
+#ifndef QT_NO_SCRIPT
+
+QT_BEGIN_NAMESPACE
+
+class QScriptable;
+class QScriptablePrivate
+{
+ Q_DECLARE_PUBLIC(QScriptable)
+public:
+ inline QScriptablePrivate()
+ : engine(0)
+ { }
+
+ static inline QScriptablePrivate *get(QScriptable *q)
+ { return q->d_func(); }
+
+ QScriptEngine *engine;
+
+ QScriptable *q_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/qscriptclass.cpp b/src/script/api/qscriptclass.cpp
index 14b8add..98cc834 100644
--- a/src/script/qscriptclass.cpp
+++ b/src/script/api/qscriptclass.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -43,21 +13,7 @@
#ifndef QT_NO_SCRIPT
-#include <QtCore/qstringlist.h>
-
-#include "qscriptclasspropertyiterator.h"
-#include "qscriptstring.h"
-#include "qscriptstring_p.h"
-#include "qscriptclass_p.h"
-#include "qscriptclassinfo_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptfunction_p.h"
-
-Q_DECLARE_METATYPE(QScriptContext*)
+// ### Q_DECLARE_METATYPE(QScriptContext*)
Q_DECLARE_METATYPE(QScriptValueList)
QT_BEGIN_NAMESPACE
@@ -149,292 +105,27 @@ QT_BEGIN_NAMESPACE
\sa queryProperty()
*/
-class QScriptCustomClassData : public QScriptClassData
+class QScriptClassPrivate
{
+ Q_DECLARE_PUBLIC(QScriptClass)
public:
- QScriptCustomClassData(QScriptClass *klass);
- ~QScriptCustomClassData();
-
- virtual void mark(const QScriptValueImpl &object, int generation);
- virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode access);
- virtual bool get(const QScriptValueImpl &obj, const QScript::Member &m,
- QScriptValueImpl *result);
- virtual bool put(QScriptValueImpl *object, const QScript::Member &member,
- const QScriptValueImpl &value);
- virtual bool removeMember(const QScriptValueImpl &object,
- const QScript::Member &member);
- virtual bool implementsHasInstance(const QScriptValueImpl &object);
- virtual bool hasInstance(const QScriptValueImpl &object,
- const QScriptValueImpl &value);
- virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object);
-
- QScriptClass *scriptClass() const;
-
-private:
- QScriptClass *m_class;
-};
+ QScriptClassPrivate() {}
+ virtual ~QScriptClassPrivate() {}
-class QScriptCustomClassDataIterator : public QScriptClassDataIterator
-{
-public:
- QScriptCustomClassDataIterator(const QScriptValueImpl &object,
- QScriptClass *klass);
- virtual ~QScriptCustomClassDataIterator();
+ QScriptEngine *engine;
- virtual bool hasNext() const;
- virtual void next(QScript::Member *member);
-
- virtual bool hasPrevious() const;
- virtual void previous(QScript::Member *member);
-
- virtual void toFront();
- virtual void toBack();
-
-private:
- void iteratorToMember(QScript::Member *member);
-
- QScriptClassPropertyIterator *m_it;
+ QScriptClass *q_ptr;
};
-QScriptCustomClassData::QScriptCustomClassData(QScriptClass *klass)
- : m_class(klass)
-{
-}
-
-QScriptCustomClassData::~QScriptCustomClassData()
-{
-}
-
-void QScriptCustomClassData::mark(const QScriptValueImpl &, int)
-{
-}
-
-bool QScriptCustomClassData::resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode access)
-{
- uint id = 0;
- QScriptClass::QueryFlags queryIn = 0;
- if (access & QScript::Read)
- queryIn |= QScriptClass::HandlesReadAccess;
- if (access & QScript::Write)
- queryIn |= QScriptClass::HandlesWriteAccess;
- QScriptEnginePrivate *eng = object.engine();
- QScriptString str = eng->internedString(nameId);
- QScriptClass::QueryFlags queryOut;
- queryOut = m_class->queryProperty(eng->toPublic(object), str, queryIn, &id);
- if (queryOut & queryIn) {
- if (base)
- *base = object;
- QScriptValue::PropertyFlags flags = m_class->propertyFlags(eng->toPublic(object), str, id);
- member->native(nameId, id, flags);
- return true;
- }
- return false;
-}
-
-bool QScriptCustomClassData::get(const QScriptValueImpl &object, const QScript::Member &member,
- QScriptValueImpl *result)
-{
- QScriptEnginePrivate *eng = object.engine();
- QScriptString str = eng->internedString(member.nameId());
- *result = eng->toImpl(m_class->property(eng->toPublic(object), str, member.id()));
- if (!result->isValid())
- *result = eng->undefinedValue();
- return true;
-}
-
-bool QScriptCustomClassData::put(QScriptValueImpl *object, const QScript::Member &member,
- const QScriptValueImpl &value)
-{
- QScriptEnginePrivate *eng = object->engine();
- QScriptString str = eng->internedString(member.nameId());
- QScriptValue publicObject = eng->toPublic(*object);
- m_class->setProperty(publicObject, str, member.id(), eng->toPublic(value));
- return true;
-}
-
-bool QScriptCustomClassData::removeMember(const QScriptValueImpl &object,
- const QScript::Member &member)
-{
- QScriptEnginePrivate *eng = object.engine();
- QScriptString str = eng->internedString(member.nameId());
- QScriptValue publicObject = eng->toPublic(object);
- m_class->setProperty(publicObject, str, member.id(), QScriptValue());
- return true;
-}
-
-bool QScriptCustomClassData::implementsHasInstance(const QScriptValueImpl &object)
-{
- if (object.classInfo() != QScriptClassPrivate::get(m_class)->classInfo())
- return false;
- return m_class->supportsExtension(QScriptClass::HasInstance);
-}
-
-bool QScriptCustomClassData::hasInstance(const QScriptValueImpl &object,
- const QScriptValueImpl &value)
-{
- QScriptEnginePrivate *eng = object.engine();
- QScriptValueList arguments;
- arguments << eng->toPublic(object) << eng->toPublic(value);
- QVariant ret = m_class->extension(QScriptClass::HasInstance, qVariantFromValue(arguments));
- return ret.toBool();
-}
-
-QScriptClassDataIterator *QScriptCustomClassData::newIterator(const QScriptValueImpl &object)
-{
- return new QScriptCustomClassDataIterator(object, m_class);
-}
-
-QScriptClass *QScriptCustomClassData::scriptClass() const
-{
- return m_class;
-}
-
-
-
-QScriptCustomClassDataIterator::QScriptCustomClassDataIterator(const QScriptValueImpl &object,
- QScriptClass *klass)
-{
- QScriptEnginePrivate *eng = object.engine();
- m_it = klass->newIterator(eng->toPublic(object));
-}
-
-QScriptCustomClassDataIterator::~QScriptCustomClassDataIterator()
-{
- if (m_it) {
- delete m_it;
- m_it = 0;
- }
-}
-
-bool QScriptCustomClassDataIterator::hasNext() const
-{
- return m_it && m_it->hasNext();
-}
-
-void QScriptCustomClassDataIterator::next(QScript::Member *member)
-{
- if (m_it) {
- m_it->next();
- iteratorToMember(member);
- }
-}
-
-bool QScriptCustomClassDataIterator::hasPrevious() const
-{
- return m_it && m_it->hasPrevious();
-}
-
-void QScriptCustomClassDataIterator::previous(QScript::Member *member)
-{
- if (m_it) {
- m_it->previous();
- iteratorToMember(member);
- }
-}
-
-void QScriptCustomClassDataIterator::toFront()
-{
- if (m_it)
- m_it->toFront();
-}
-
-void QScriptCustomClassDataIterator::toBack()
-{
- if (m_it)
- m_it->toBack();
-}
-
-void QScriptCustomClassDataIterator::iteratorToMember(QScript::Member *member)
-{
- QScriptString str = m_it->name();
- QScriptNameIdImpl *nameId = 0;
- if (str.isValid())
- nameId = QScriptStringPrivate::get(str)->nameId;
- member->native(nameId, m_it->id(), m_it->flags());
-}
-
-
-
-QScriptClassPrivate::QScriptClassPrivate(QScriptClass *q)
- : engine(0), m_classInfo(0), q_ptr(q)
-{
-}
-
-QScriptClassPrivate::~QScriptClassPrivate()
-{
- if (m_classInfo) {
- // classInfo is owned by engine
- // set the data to the normal Object class data
- delete m_classInfo->data();
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- m_classInfo->setData(eng_p->m_class_object->data());
- }
-}
-
-QScriptClassPrivate *QScriptClassPrivate::get(QScriptClass *klass)
-{
- return klass->d_func();
-}
-
-QScriptClassInfo *QScriptClassPrivate::classInfo()
-{
- Q_Q(QScriptClass);
- if (m_classInfo)
- return m_classInfo;
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- int classType = eng_p->registerCustomClassType();
- if (q->supportsExtension(QScriptClass::Callable))
- classType |= QScriptClassInfo::FunctionBased;
- QString name = q->name();
- if (name.isEmpty())
- name = QLatin1String("Object");
- m_classInfo = eng_p->registerClass(name, classType);
- m_classInfo->setData(new QScriptCustomClassData(q_func()));
- return m_classInfo;
-}
-
-QScriptClass *QScriptClassPrivate::classFromInfo(QScriptClassInfo *info)
-{
- QScriptCustomClassData *data = static_cast<QScriptCustomClassData*>(info->data());
- Q_ASSERT(data != 0);
- return data->scriptClass();
-}
-
-static QScriptValueImpl callScriptClassFunction(QScriptContextPrivate *ctx,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- qMetaTypeId<QScriptContext*>();
- if (QScriptClassData *data = classInfo->data()) {
- QScriptCustomClassData *customData = static_cast<QScriptCustomClassData*>(data);
- QScriptClass *klass = customData->scriptClass();
- QVariant arg = qVariantFromValue(QScriptContextPrivate::get(ctx));
- QVariant ret = klass->extension(QScriptClass::Callable, arg);
- QScriptValueImpl val = eng->valueFromVariant(ret);
- if (val.isValid())
- return val;
- }
- return eng->undefinedValue();
-}
-
-QScriptFunction *QScriptClassPrivate::newFunction()
-{
- return new QScript::C2Function(callScriptClassFunction, /*length=*/0,
- classInfo(), /*name=*/QString());
-}
-
/*!
Constructs a QScriptClass object to be used in the given \a engine.
The engine does not take ownership of the QScriptClass object.
*/
QScriptClass::QScriptClass(QScriptEngine *engine)
- : d_ptr(new QScriptClassPrivate(this))
+ : d_ptr(new QScriptClassPrivate)
{
+ d_ptr->q_ptr = this;
d_ptr->engine = engine;
}
diff --git a/src/script/qscriptclass.h b/src/script/api/qscriptclass.h
index 9c06ea2..5999500 100644
--- a/src/script/qscriptclass.h
+++ b/src/script/api/qscriptclass.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptclasspropertyiterator.cpp b/src/script/api/qscriptclasspropertyiterator.cpp
index 96f34d5..a0ce34d 100644
--- a/src/script/qscriptclasspropertyiterator.cpp
+++ b/src/script/api/qscriptclasspropertyiterator.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -43,7 +13,6 @@
#ifndef QT_NO_SCRIPT
-#include "qscriptclasspropertyiterator_p.h"
#include "qscriptstring.h"
QT_BEGIN_NAMESPACE
@@ -74,14 +43,17 @@ QT_BEGIN_NAMESPACE
\sa QScriptClass::newIterator(), QScriptValueIterator
*/
-QScriptClassPropertyIteratorPrivate::QScriptClassPropertyIteratorPrivate(QScriptClassPropertyIterator *q)
- : q_ptr(q)
+class QScriptClassPropertyIteratorPrivate
{
-}
+ Q_DECLARE_PUBLIC(QScriptClassPropertyIterator)
+public:
+ QScriptClassPropertyIteratorPrivate() {}
+ virtual ~QScriptClassPropertyIteratorPrivate() {}
-QScriptClassPropertyIteratorPrivate::~QScriptClassPropertyIteratorPrivate()
-{
-}
+ QScriptValue object;
+
+ QScriptClassPropertyIterator *q_ptr;
+};
/*!
Constructs an iterator for traversing \a object.
@@ -90,8 +62,9 @@ QScriptClassPropertyIteratorPrivate::~QScriptClassPropertyIteratorPrivate()
sequence of properties (before the first property).
*/
QScriptClassPropertyIterator::QScriptClassPropertyIterator(const QScriptValue &object)
- : d_ptr(new QScriptClassPropertyIteratorPrivate(this))
+ : d_ptr(new QScriptClassPropertyIteratorPrivate)
{
+ d_ptr->q_ptr = this;
d_ptr->object = object;
}
diff --git a/src/script/api/qscriptclasspropertyiterator.h b/src/script/api/qscriptclasspropertyiterator.h
new file mode 100644
index 0000000..a7d2e45
--- /dev/null
+++ b/src/script/api/qscriptclasspropertyiterator.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTCLASSPROPERTYITERATOR_H
+#define QSCRIPTCLASSPROPERTYITERATOR_H
+
+#include <QtCore/qstring.h>
+
+#ifndef QT_NO_SCRIPT
+
+#include <QtScript/qscriptvalue.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Script)
+
+class QScriptClassPropertyIteratorPrivate;
+class Q_SCRIPT_EXPORT QScriptClassPropertyIterator
+{
+protected:
+ QScriptClassPropertyIterator(const QScriptValue &object);
+
+public:
+ virtual ~QScriptClassPropertyIterator();
+
+ QScriptValue object() const;
+
+ virtual bool hasNext() const = 0;
+ virtual void next() = 0;
+
+ virtual bool hasPrevious() const = 0;
+ virtual void previous() = 0;
+
+ virtual void toFront() = 0;
+ virtual void toBack() = 0;
+
+ virtual QScriptString name() const = 0;
+ virtual uint id() const;
+ virtual QScriptValue::PropertyFlags flags() const;
+
+protected:
+ QScriptClassPropertyIterator(const QScriptValue &object, QScriptClassPropertyIteratorPrivate &dd);
+ QScriptClassPropertyIteratorPrivate *d_ptr;
+
+private:
+ Q_DECLARE_PRIVATE(QScriptClassPropertyIterator)
+ Q_DISABLE_COPY(QScriptClassPropertyIterator)
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp
index ff519c7..ccfe6ec 100644
--- a/src/script/qscriptcontext.cpp
+++ b/src/script/api/qscriptcontext.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -43,12 +13,15 @@
#ifndef QT_NO_SCRIPT
-#include "qscriptcontextinfo.h"
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
+#include "qscriptengine.h"
+#include "qscriptengine_p.h"
+
+#include "Error.h"
+#include "JSObject.h"
+#include "JSGlobalObject.h"
+
+#include <QtCore/qstringlist.h>
QT_BEGIN_NAMESPACE
@@ -154,6 +127,40 @@ QT_BEGIN_NAMESPACE
\value UnknownError An unknown error.
*/
+namespace QScript
+{
+JSC::UString qtStringToJSCUString(const QString &);
+}
+
+QScriptContextPrivate::QScriptContextPrivate(JSC::JSObject *callee_,
+ JSC::JSValue thisObject_,
+ const JSC::ArgList &args_,
+ bool calledAsConstructor_,
+ QScriptEnginePrivate *engine_)
+ : callee(callee_), thisObject(thisObject_), args(args_),
+ calledAsConstructor(calledAsConstructor_), engine(engine_)
+{
+}
+
+QScriptContextPrivate::~QScriptContextPrivate()
+{
+}
+
+QScriptContext *QScriptContextPrivate::create(QScriptContextPrivate &dd)
+{
+ QScriptContext *q = new QScriptContext();
+ q->d_ptr = &dd;
+ return q;
+}
+
+/*!
+ \internal
+*/
+QScriptContext::QScriptContext()
+ : d_ptr(0)
+{
+}
+
/*!
Throws an exception with the given \a value.
Returns the value thrown (the same as the argument).
@@ -163,11 +170,9 @@ QT_BEGIN_NAMESPACE
QScriptValue QScriptContext::throwValue(const QScriptValue &value)
{
Q_D(QScriptContext);
- d->m_result = d->engine()->toImpl(value);
- d->m_state = QScriptContext::ExceptionState;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- d->engine()->notifyException(d);
-#endif
+ JSC::ExecState *exec = d->engine->globalObject->globalExec();
+ JSC::JSValue jscValue = d->engine->scriptValueToJSCValue(value);
+ exec->setException(jscValue);
return value;
}
@@ -188,7 +193,29 @@ QScriptValue QScriptContext::throwValue(const QScriptValue &value)
QScriptValue QScriptContext::throwError(Error error, const QString &text)
{
Q_D(QScriptContext);
- return d->engine()->toPublic(d->throwError(error, text));
+ JSC::ErrorType jscError = JSC::GeneralError;
+ switch (error) {
+ case UnknownError:
+ break;
+ case ReferenceError:
+ jscError = JSC::ReferenceError;
+ break;
+ case SyntaxError:
+ jscError = JSC::SyntaxError;
+ break;
+ case TypeError:
+ jscError = JSC::TypeError;
+ break;
+ case RangeError:
+ jscError = JSC::RangeError;
+ break;
+ case URIError:
+ jscError = JSC::URIError;
+ break;
+ }
+ JSC::ExecState *exec = d->engine->globalObject->globalExec();
+ JSC::JSObject *result = JSC::throwError(exec, jscError, QScript::qtStringToJSCUString(text));
+ return d->engine->scriptValueFromJSCValue(result);
}
/*!
@@ -202,16 +229,9 @@ QScriptValue QScriptContext::throwError(Error error, const QString &text)
QScriptValue QScriptContext::throwError(const QString &text)
{
Q_D(QScriptContext);
- return d->engine()->toPublic(d->throwError(text));
-}
-
-/*!
- \internal
-*/
-QScriptContext::QScriptContext():
- d_ptr(new QScriptContextPrivate())
-{
- d_ptr->q_ptr = this;
+ JSC::ExecState *exec = d->engine->globalObject->globalExec();
+ JSC::JSObject *result = JSC::throwError(exec, JSC::GeneralError, QScript::qtStringToJSCUString(text));
+ return d->engine->scriptValueFromJSCValue(result);
}
/*!
@@ -219,7 +239,7 @@ QScriptContext::QScriptContext():
*/
QScriptContext::~QScriptContext()
{
- delete d_ptr;
+ // d_ptr is stack-allocated
d_ptr = 0;
}
@@ -229,7 +249,7 @@ QScriptContext::~QScriptContext()
QScriptEngine *QScriptContext::engine() const
{
Q_D(const QScriptContext);
- return QScriptEnginePrivate::get(d->engine());
+ return QScriptEnginePrivate::get(d->engine);
}
/*!
@@ -243,9 +263,9 @@ QScriptEngine *QScriptContext::engine() const
QScriptValue QScriptContext::argument(int index) const
{
Q_D(const QScriptContext);
- if (index < 0)
- return QScriptValue();
- return d->engine()->toPublic(d->argument(index));
+ if ((index < 0) || (index >= (int)d->args.size()))
+ return QScriptValue(QScriptValue::UndefinedValue);
+ return d->engine->scriptValueFromJSCValue(d->args.at(index));
}
/*!
@@ -255,7 +275,7 @@ QScriptValue QScriptContext::argument(int index) const
QScriptValue QScriptContext::callee() const
{
Q_D(const QScriptContext);
- return d->engine()->toPublic(d->m_callee);
+ return d->engine->scriptValueFromJSCValue(d->callee);
}
/*!
@@ -275,8 +295,11 @@ QScriptValue QScriptContext::callee() const
*/
QScriptValue QScriptContext::argumentsObject() const
{
- Q_D(const QScriptContext);
- return d->engine()->toPublic(d->argumentsObject());
+ // ### for now we cheat extremely
+ QScriptValue array = engine()->newArray(argumentCount());
+ for (int i = 0; i < argumentCount(); ++i)
+ array.setProperty(i, argument(i));
+ return array;
}
/*!
@@ -289,7 +312,7 @@ QScriptValue QScriptContext::argumentsObject() const
bool QScriptContext::isCalledAsConstructor() const
{
Q_D(const QScriptContext);
- return d->m_calledAsConstructor;
+ return d->calledAsConstructor;
}
/*!
@@ -297,8 +320,8 @@ bool QScriptContext::isCalledAsConstructor() const
*/
QScriptContext *QScriptContext::parentContext() const
{
- Q_D(const QScriptContext);
- return QScriptContextPrivate::get(d->previous);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return 0;
}
/*!
@@ -314,7 +337,7 @@ QScriptContext *QScriptContext::parentContext() const
int QScriptContext::argumentCount() const
{
Q_D(const QScriptContext);
- return d->argc;
+ return d->args.size();
}
/*!
@@ -322,8 +345,8 @@ int QScriptContext::argumentCount() const
*/
QScriptValue QScriptContext::returnValue() const
{
- Q_D(const QScriptContext);
- return d->engine()->toPublic(d->m_result);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QScriptValue();
}
/*!
@@ -331,8 +354,8 @@ QScriptValue QScriptContext::returnValue() const
*/
void QScriptContext::setReturnValue(const QScriptValue &result)
{
- Q_D(QScriptContext);
- d->m_result = d->engine()->toImpl(result);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(result);
}
/*!
@@ -344,8 +367,8 @@ void QScriptContext::setReturnValue(const QScriptValue &result)
*/
QScriptValue QScriptContext::activationObject() const
{
- Q_D(const QScriptContext);
- return d->engine()->toPublic(d->activationObject());
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QScriptValue();
}
/*!
@@ -356,16 +379,8 @@ QScriptValue QScriptContext::activationObject() const
*/
void QScriptContext::setActivationObject(const QScriptValue &activation)
{
- Q_D(QScriptContext);
- if (!activation.isObject()) {
- return;
- } else if (activation.engine() != engine()) {
- qWarning("QScriptContext::setActivationObject() failed: "
- "cannot set an object created in "
- "a different engine");
- } else {
- d->m_activation = d->engine()->toImpl(activation);
- }
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(activation);
}
/*!
@@ -374,7 +389,7 @@ void QScriptContext::setActivationObject(const QScriptValue &activation)
QScriptValue QScriptContext::thisObject() const
{
Q_D(const QScriptContext);
- return d->engine()->toPublic(d->m_thisObject);
+ return d->engine->scriptValueFromJSCValue(d->thisObject);
}
/*!
@@ -386,14 +401,9 @@ QScriptValue QScriptContext::thisObject() const
void QScriptContext::setThisObject(const QScriptValue &thisObject)
{
Q_D(QScriptContext);
- if (!thisObject.isObject()) {
- } else if (thisObject.engine() != engine()) {
- qWarning("QScriptContext::setThisObject() failed: "
- "cannot set an object created in "
- "a different engine");
- } else {
- d->m_thisObject = d->engine()->toImpl(thisObject);
- }
+ if (!thisObject.isObject())
+ return;
+ d->thisObject = d->engine->scriptValueToJSCValue(thisObject);
}
/*!
@@ -402,7 +412,9 @@ void QScriptContext::setThisObject(const QScriptValue &thisObject)
QScriptContext::ExecutionState QScriptContext::state() const
{
Q_D(const QScriptContext);
- return d->m_state;
+ if (d->engine->globalObject->globalExec()->hadException())
+ return QScriptContext::ExceptionState;
+ return QScriptContext::NormalState;
}
/*!
@@ -418,16 +430,8 @@ QScriptContext::ExecutionState QScriptContext::state() const
*/
QStringList QScriptContext::backtrace() const
{
- Q_D(const QScriptContext);
- return d->backtrace();
-}
-
-static QString safeValueToString(const QScriptValue &value)
-{
- if (value.isObject())
- return QLatin1String("[object Object]");
- else
- return value.toString();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QStringList();
}
/*!
@@ -440,46 +444,9 @@ static QString safeValueToString(const QScriptValue &value)
*/
QString QScriptContext::toString() const
{
- QScriptContextInfo info(this);
- QString result;
-
- QString functionName = info.functionName();
- if (functionName.isEmpty()) {
- if (parentContext()) {
- if (info.functionType() == QScriptContextInfo::ScriptFunction)
- result.append(QLatin1String("<anonymous>"));
- else
- result.append(QLatin1String("<native>"));
- } else {
- result.append(QLatin1String("<global>"));
- }
- } else {
- result.append(functionName);
- }
- QStringList parameterNames = info.functionParameterNames();
- result.append(QLatin1String(" ("));
- for (int i = 0; i < argumentCount(); ++i) {
- if (i > 0)
- result.append(QLatin1String(", "));
- if (i < parameterNames.count()) {
- result.append(parameterNames.at(i));
- result.append(QLatin1Char('='));
- }
- QScriptValue arg = argument(i);
- result.append(safeValueToString(arg));
- }
- result.append(QLatin1Char(')'));
-
- QString fileName = info.fileName();
- int lineNumber = info.lineNumber();
- result.append(QLatin1String(" at "));
- if (!fileName.isEmpty()) {
- result.append(fileName);
- result.append(QLatin1Char(':'));
- }
- result.append(QString::number(lineNumber));
- return result;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QString();
}
/*!
@@ -490,24 +457,8 @@ QString QScriptContext::toString() const
*/
QScriptValueList QScriptContext::scopeChain() const
{
- Q_D(const QScriptContext);
- // make sure arguments properties are initialized
- const QScriptContextPrivate *ctx = d;
- while (ctx) {
- (void)ctx->activationObject();
- ctx = ctx->previous;
- }
- QScriptValueList result;
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine());
- QScriptValueImpl scope = d->m_scopeChain;
- while (scope.isObject()) {
- if (scope.classInfo() == eng_p->m_class_with)
- result.append(eng_p->toPublic(scope.prototype()));
- else
- result.append(eng_p->toPublic(scope));
- scope = scope.scope();
- }
- return result;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QScriptValueList();
}
/*!
@@ -520,25 +471,8 @@ QScriptValueList QScriptContext::scopeChain() const
*/
void QScriptContext::pushScope(const QScriptValue &object)
{
- Q_D(QScriptContext);
- if (!object.isObject()) {
- return;
- } else if (object.engine() != engine()) {
- qWarning("QScriptContext::pushScope() failed: "
- "cannot push an object created in "
- "a different engine");
- return;
- }
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine());
- if (!d->m_scopeChain.isValid()) {
- d->m_scopeChain = eng_p->toImpl(object);
- } else {
- QScriptValueImpl withObject;
- eng_p->newObject(&withObject, eng_p->toImpl(object), eng_p->m_class_with);
- withObject.m_object_value->m_scope = d->m_scopeChain;
- withObject.setInternalValue(1); // to differentiate from with-statement objects
- d->m_scopeChain = withObject;
- }
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(object);
}
/*!
@@ -553,17 +487,8 @@ void QScriptContext::pushScope(const QScriptValue &object)
*/
QScriptValue QScriptContext::popScope()
{
- Q_D(QScriptContext);
- if (!d->m_scopeChain.isObject())
- return QScriptValue();
- QScriptValueImpl result;
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine());
- if (d->m_scopeChain.classInfo() != eng_p->m_class_with)
- result = d->m_scopeChain;
- else
- result = d->m_scopeChain.prototype();
- d->m_scopeChain = d->m_scopeChain.m_object_value->m_scope;
- return eng_p->toPublic(result);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QScriptValue();
}
QT_END_NAMESPACE
diff --git a/src/script/qscriptcontext.h b/src/script/api/qscriptcontext.h
index 1e1f987..4941d40 100644
--- a/src/script/qscriptcontext.h
+++ b/src/script/api/qscriptcontext.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/api/qscriptcontext_p.h b/src/script/api/qscriptcontext_p.h
new file mode 100644
index 0000000..5041845
--- /dev/null
+++ b/src/script/api/qscriptcontext_p.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTCONTEXT_P_H
+#define QSCRIPTCONTEXT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qobjectdefs.h>
+
+#ifndef QT_NO_SCRIPT
+
+QT_BEGIN_NAMESPACE
+
+namespace JSC
+{
+ class JSObject;
+ class ArgList;
+}
+
+#include "wtf/Platform.h"
+#include "JSValue.h"
+
+class QScriptEnginePrivate;
+
+class QScriptContext;
+class QScriptContextPrivate
+{
+public:
+ QScriptContextPrivate(JSC::JSObject *callee,
+ JSC::JSValue thisObject,
+ const JSC::ArgList &args,
+ bool calledAsConstructor,
+ QScriptEnginePrivate *engine);
+ ~QScriptContextPrivate();
+
+ static QScriptContext *create(QScriptContextPrivate &dd);
+
+ JSC::JSObject *callee;
+ JSC::JSValue thisObject;
+ const JSC::ArgList &args;
+ bool calledAsConstructor;
+ QScriptEnginePrivate *engine;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp
index 260d19f..e6a7ed8 100644
--- a/src/script/qscriptcontextinfo.cpp
+++ b/src/script/api/qscriptcontextinfo.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -43,12 +13,6 @@
#ifndef QT_NO_SCRIPT
-#include "qscriptcontextinfo_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
#include <QtCore/qdatastream.h>
QT_BEGIN_NAMESPACE
@@ -97,95 +61,36 @@ QT_BEGIN_NAMESPACE
\value NativeFunction The function is a built-in Qt Script function, or it was defined through a call to QScriptEngine::newFunction().
*/
+class QScriptContextInfoPrivate
+{
+ Q_DECLARE_PUBLIC(QScriptContextInfo)
+public:
+ QScriptContextInfoPrivate();
+ QScriptContextInfoPrivate(const QScriptContext *context);
+ ~QScriptContextInfoPrivate();
+
+ QBasicAtomicInt ref;
+
+ QScriptContextInfo *q_ptr;
+};
+
/*!
\internal
*/
QScriptContextInfoPrivate::QScriptContextInfoPrivate()
- : q_ptr(0)
{
ref = 0;
- functionType = QScriptContextInfo::NativeFunction;
- functionMetaIndex = -1;
- functionStartLineNumber = -1;
- functionEndLineNumber = -1;
- scriptId = -1;
- lineNumber = -1;
- columnNumber = -1;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
\internal
*/
QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *context)
- : q_ptr(0)
{
Q_ASSERT(context);
ref = 0;
- functionType = QScriptContextInfo::NativeFunction;
- functionMetaIndex = -1;
- functionStartLineNumber = -1;
- functionEndLineNumber = -1;
-
- const QScriptContextPrivate *ctx_p = QScriptContextPrivate::get(context);
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- scriptId = ctx_p->scriptId();
-#endif
- fileName = ctx_p->fileName();
- lineNumber = ctx_p->currentLine;
- columnNumber = ctx_p->currentColumn;
-
- QScriptValueImpl callee = ctx_p->engine()->toImpl(context->callee());
- QScriptFunction *fun = callee.toFunction();
- if (fun) {
- functionName = fun->functionName();
- functionStartLineNumber = fun->startLineNumber();
- functionEndLineNumber = fun->endLineNumber();
-
- switch (fun->type()) {
- case QScriptFunction::Unknown:
- functionType = QScriptContextInfo::NativeFunction;
- break;
-
- case QScriptFunction::Script:
- functionType = QScriptContextInfo::ScriptFunction;
- for (int i = 0; i < fun->formals.count(); ++i)
- parameterNames.append(fun->formals.at(i)->s);
- break;
-
- case QScriptFunction::C:
- functionType = QScriptContextInfo::NativeFunction;
- break;
-
- case QScriptFunction::C2:
- functionType = QScriptContextInfo::NativeFunction;
- break;
-
- case QScriptFunction::C3:
- functionType = QScriptContextInfo::NativeFunction;
- break;
-
- case QScriptFunction::Qt: {
- functionType = QScriptContextInfo::QtFunction;
- functionMetaIndex = ctx_p->calleeMetaIndex;
-
-#ifndef QT_NO_QOBJECT
- const QMetaObject *meta;
- meta = static_cast<QScript::QtFunction*>(fun)->metaObject();
- if (meta) {
- QMetaMethod method = meta->method(functionMetaIndex);
- QList<QByteArray> formals = method.parameterNames();
- for (int i = 0; i < formals.count(); ++i)
- parameterNames.append(QLatin1String(formals.at(i)));
- }
-#endif
- } break;
-
- case QScriptFunction::QtProperty:
- functionType = QScriptContextInfo::QtPropertyFunction;
- functionMetaIndex = ctx_p->calleeMetaIndex;
- break;
- }
- }
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
@@ -272,10 +177,8 @@ QScriptContextInfo &QScriptContextInfo::operator=(const QScriptContextInfo &othe
*/
qint64 QScriptContextInfo::scriptId() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->scriptId;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return -1;
}
/*!
@@ -289,10 +192,8 @@ qint64 QScriptContextInfo::scriptId() const
*/
QString QScriptContextInfo::fileName() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return QString();
- return d->fileName;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QString();
}
/*!
@@ -306,10 +207,8 @@ QString QScriptContextInfo::fileName() const
*/
int QScriptContextInfo::lineNumber() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->lineNumber;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return -1;
}
/*!
@@ -323,10 +222,8 @@ int QScriptContextInfo::lineNumber() const
*/
int QScriptContextInfo::columnNumber() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->columnNumber;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return -1;
}
/*!
@@ -342,10 +239,7 @@ int QScriptContextInfo::columnNumber() const
*/
QString QScriptContextInfo::functionName() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return QString();
- return d->functionName;
+ return QString();
}
/*!
@@ -355,10 +249,8 @@ QString QScriptContextInfo::functionName() const
*/
QScriptContextInfo::FunctionType QScriptContextInfo::functionType() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return NativeFunction;
- return d->functionType;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return ScriptFunction;
}
/*!
@@ -372,10 +264,8 @@ QScriptContextInfo::FunctionType QScriptContextInfo::functionType() const
*/
int QScriptContextInfo::functionStartLineNumber() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->functionStartLineNumber;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return -1;
}
/*!
@@ -389,10 +279,8 @@ int QScriptContextInfo::functionStartLineNumber() const
*/
int QScriptContextInfo::functionEndLineNumber() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->functionEndLineNumber;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return -1;
}
/*!
@@ -403,10 +291,8 @@ int QScriptContextInfo::functionEndLineNumber() const
*/
QStringList QScriptContextInfo::functionParameterNames() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return QStringList();
- return d->parameterNames;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QStringList();
}
/*!
@@ -424,10 +310,8 @@ QStringList QScriptContextInfo::functionParameterNames() const
*/
int QScriptContextInfo::functionMetaIndex() const
{
- Q_D(const QScriptContextInfo);
- if (!d)
- return -1;
- return d->functionMetaIndex;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return -1;
}
/*!
@@ -436,8 +320,8 @@ int QScriptContextInfo::functionMetaIndex() const
*/
bool QScriptContextInfo::isNull() const
{
- Q_D(const QScriptContextInfo);
- return (d == 0);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return false;
}
/*!
@@ -452,16 +336,8 @@ bool QScriptContextInfo::operator==(const QScriptContextInfo &other) const
return true;
if (!d || !od)
return false;
- return ((d->scriptId == od->scriptId)
- && (d->lineNumber == od->lineNumber)
- && (d->columnNumber == od->columnNumber)
- && (d->fileName == od->fileName)
- && (d->functionName == od->functionName)
- && (d->functionType == od->functionType)
- && (d->functionStartLineNumber == od->functionStartLineNumber)
- && (d->functionEndLineNumber == od->functionEndLineNumber)
- && (d->functionMetaIndex == od->functionMetaIndex)
- && (d->parameterNames == od->parameterNames));
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return false;
}
/*!
@@ -514,36 +390,7 @@ Q_SCRIPT_EXPORT QDataStream &operator>>(QDataStream &in, QScriptContextInfo &inf
info.d_ptr->ref.ref();
}
- in >> info.d_ptr->scriptId;
-
- qint32 line;
- in >> line;
- info.d_ptr->lineNumber = line;
-
- qint32 column;
- in >> column;
- info.d_ptr->columnNumber = column;
-
- quint32 ftype;
- in >> ftype;
- info.d_ptr->functionType = QScriptContextInfo::FunctionType(ftype);
-
- qint32 startLine;
- in >> startLine;
- info.d_ptr->functionStartLineNumber = startLine;
-
- qint32 endLine;
- in >> endLine;
- info.d_ptr->functionEndLineNumber = endLine;
-
- qint32 metaIndex;
- in >> metaIndex;
- info.d_ptr->functionMetaIndex = metaIndex;
-
- in >> info.d_ptr->fileName;
- in >> info.d_ptr->functionName;
- in >> info.d_ptr->parameterNames;
-
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
return in;
}
#endif
diff --git a/src/script/qscriptcontextinfo.h b/src/script/api/qscriptcontextinfo.h
index a683733..19323bb 100644
--- a/src/script/qscriptcontextinfo.h
+++ b/src/script/api/qscriptcontextinfo.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 97021fc..873091b 100644
--- a/src/script/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -44,11 +14,37 @@
#ifndef QT_NO_SCRIPT
#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptsyntaxcheckresult_p.h"
+#include "../bridge/qscriptqobject_p.h"
+#include "qscriptstring_p.h"
+#include "qscriptvalue_p.h"
+#include "qscriptvalueiterator.h"
+
+#include <QtCore/qstringlist.h>
+
+#include "Error.h"
+#include "JSArray.h"
+#include "JSImmediate.h"
+#include "JSLock.h"
+#include "Interpreter.h"
+#include "DateConstructor.h"
+#include "RegExpConstructor.h"
+#include "Completion.h"
+#include "PrototypeFunction.h"
+#include "InitializeThreading.h"
+#include "ObjectPrototype.h"
+#include "SourceCode.h"
+
+#include "utils/qscriptdate_p.h"
+#include "bridge/qscriptfunction_p.h"
+#include "bridge/qscriptvariant_p.h"
+#include "bridge/qscriptqobject_p.h"
+
+Q_DECLARE_METATYPE(QScriptValue)
+Q_DECLARE_METATYPE(QVariant)
+#ifndef QT_NO_QOBJECT
+Q_DECLARE_METATYPE(QObjectList)
+#endif
+Q_DECLARE_METATYPE(QList<int>)
QT_BEGIN_NAMESPACE
@@ -266,13 +262,419 @@ QT_BEGIN_NAMESPACE
\value SkipMethodsInEnumeration Don't include methods (signals and slots) when enumerating the object's properties.
*/
+class QScriptTypeInfo
+{
+public:
+ QScriptTypeInfo() : signature(0, '\0'), marshal(0), demarshal(0)
+ { }
+
+ QByteArray signature;
+ QScriptEngine::MarshalFunction marshal;
+ QScriptEngine::DemarshalFunction demarshal;
+ QScriptValue prototype;
+};
+
+namespace JSC {
+
+static JSValue JSC_HOST_CALL functionPrint(ExecState*, JSObject*, JSValue, const ArgList&);
+static JSValue JSC_HOST_CALL functionGC(ExecState*, JSObject*, JSValue, const ArgList&);
+static JSValue JSC_HOST_CALL functionVersion(ExecState*, JSObject*, JSValue, const ArgList&);
+static JSValue JSC_HOST_CALL functionLoad(ExecState*, JSObject*, JSValue, const ArgList&);
+
+JSValue functionPrint(ExecState* exec, JSObject*, JSValue, const ArgList& args)
+{
+ for (unsigned i = 0; i < args.size(); ++i) {
+ if (i != 0)
+ putchar(' ');
+
+ printf("%s", args.at(i).toString(exec).UTF8String().c_str());
+ }
+
+ putchar('\n');
+ fflush(stdout);
+ return jsUndefined();
+}
+
+JSValue functionGC(ExecState* exec, JSObject*, JSValue, const ArgList&)
+{
+ JSLock lock(false);
+ exec->heap()->collect();
+ return jsUndefined();
+}
+
+JSValue functionVersion(ExecState *exec, JSObject*, JSValue, const ArgList&)
+{
+ return JSC::JSValue(exec, 1);
+}
+
+static bool fillBufferWithContentsOfFile(const UString& fileName, Vector<char>& buffer)
+{
+ FILE* f = fopen(fileName.UTF8String().c_str(), "r");
+ if (!f) {
+ fprintf(stderr, "Could not open file: %s\n", fileName.UTF8String().c_str());
+ return false;
+ }
+
+ size_t buffer_size = 0;
+ size_t buffer_capacity = 1024;
+
+ buffer.resize(buffer_capacity);
+
+ while (!feof(f) && !ferror(f)) {
+ buffer_size += fread(buffer.data() + buffer_size, 1, buffer_capacity - buffer_size, f);
+ if (buffer_size == buffer_capacity) { // guarantees space for trailing '\0'
+ buffer_capacity *= 2;
+ buffer.resize(buffer_capacity);
+ }
+ }
+ fclose(f);
+ buffer[buffer_size] = '\0';
+
+ return true;
+}
+
+JSValue functionLoad(ExecState* exec, JSObject*, JSValue, const ArgList& args)
+{
+ UString fileName = args.at(0).toString(exec);
+ Vector<char> script;
+ if (!fillBufferWithContentsOfFile(fileName, script))
+ return throwError(exec, GeneralError, "Could not open file.");
+
+ JSGlobalObject* globalObject = exec->dynamicGlobalObject();
+ JSC::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(script.data(), fileName));
+
+ return jsUndefined();
+}
+
+} // namespace JSC
+
+namespace QScript
+{
+
+JSC::UString qtStringToJSCUString(const QString &str)
+{
+ return JSC::UString(reinterpret_cast<const UChar*>(str.constData()), str.length());
+}
+
+QString qtStringFromJSCUString(const JSC::UString &str)
+{
+ return QString(reinterpret_cast<const QChar*>(str.data()), str.size());
+}
+
+GlobalObject::GlobalObject(QScriptEnginePrivate *eng)
+ : JSC::JSGlobalObject(), engine(eng)
+{
+}
+
+GlobalObject::~GlobalObject()
+{
+}
+
+void GlobalObject::mark()
+{
+ JSC::JSGlobalObject::mark();
+
+ if (engine->qobjectPrototype)
+ engine->qobjectPrototype->mark();
+ if (engine->variantPrototype)
+ engine->variantPrototype->mark();
+
+ {
+ QHash<JSC::JSValue,QBasicAtomicInt>::const_iterator it;
+ for (it = engine->keepAliveValues.constBegin(); it != engine->keepAliveValues.constEnd(); ++it) {
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+// it.key().mark();
+ }
+ }
+
+#ifndef QT_NO_QOBJECT
+ {
+ QHash<QObject*, QScript::QObjectData*>::const_iterator it;
+ for (it = engine->m_qobjectData.constBegin(); it != engine->m_qobjectData.constEnd(); ++it) {
+ QScript::QObjectData *qdata = it.value();
+ qdata->mark();
+ }
+ }
+#endif
+}
+
+} // namespace QScript
+
+namespace JSC
+{
+ASSERT_CLASS_FITS_IN_CELL(QScript::GlobalObject);
+}
+
+QScriptEnginePrivate::QScriptEnginePrivate()
+{
+ JSC::initializeThreading(); // ### hmmm
+
+ JSC::JSGlobalData *data = JSC::JSGlobalData::create().releaseRef();
+ globalObject = new (data)QScript::GlobalObject(this);
+
+ JSC::ExecState* exec = globalObject->globalExec();
+
+ qobjectPrototype = new (exec) QScript::QObjectPrototype(exec, QScript::QObjectPrototype::createStructure(globalObject->objectPrototype()), globalObject->prototypeFunctionStructure());
+ qobjectWrapperObjectStructure = QScript::QObjectWrapperObject::createStructure(qobjectPrototype);
+ variantPrototype = new (exec) QScript::QVariantPrototype(exec, QScript::QVariantPrototype::createStructure(globalObject->objectPrototype()), globalObject->prototypeFunctionStructure());
+ variantWrapperObjectStructure = QScript::QVariantWrapperObject::createStructure(variantPrototype);
+
+ globalObject->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, globalObject->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "print"), JSC::functionPrint));
+ globalObject->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, globalObject->prototypeFunctionStructure(), 0, JSC::Identifier(exec, "gc"), JSC::functionGC));
+ globalObject->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, globalObject->prototypeFunctionStructure(), 0, JSC::Identifier(exec, "version"), JSC::functionVersion));
+ globalObject->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, globalObject->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "load"), JSC::functionLoad));
+
+ agent = 0;
+ processEventsInterval = -1;
+}
+
+QScriptEnginePrivate::~QScriptEnginePrivate()
+{
+ qDeleteAll(m_qobjectData);
+ qDeleteAll(m_typeInfos);
+}
+
+QScriptValue QScriptEnginePrivate::scriptValueFromJSCValue(JSC::JSValue value)
+{
+ Q_Q(QScriptEngine);
+ if (!value)
+ return QScriptValue();
+ QScriptValue result;
+ QScriptValuePrivate::initFromJSCValue(result, q, value);
+ return result;
+}
+
+JSC::JSValue QScriptEnginePrivate::scriptValueToJSCValue(const QScriptValue &value)
+{
+ QScriptValuePrivate *vv = QScriptValuePrivate::get(value);
+ if (!vv)
+ return JSC::JSValue();
+ switch (vv->type) {
+ case QScriptValuePrivate::JSC:
+ return vv->jscValue;
+ case QScriptValuePrivate::Number:
+ return JSC::jsNumber(globalObject->globalExec(), vv->numberValue);
+ case QScriptValuePrivate::String:
+ return JSC::jsString(globalObject->globalExec(), QScript::qtStringToJSCUString(*vv->stringValue));
+ }
+ return JSC::JSValue();
+}
+
+void QScriptEnginePrivate::releaseJSCValue(JSC::JSValue value)
+{
+// ### Q_ASSERT(!JSC::JSImmediate::isImmediate(value));
+ Q_ASSERT(keepAliveValues.contains(value));
+ if (!keepAliveValues[value].deref())
+ keepAliveValues.remove(value);
+}
+
+QScriptValue QScriptEnginePrivate::scriptValueFromVariant(const QVariant &v)
+{
+ Q_Q(QScriptEngine);
+ QScriptValue result = q->create(v.userType(), v.data());
+ Q_ASSERT(result.isValid());
+ return result;
+}
+
+QVariant QScriptEnginePrivate::scriptValueToVariant(const QScriptValue &value, int targetType)
+{
+ QVariant v(targetType, (void *)0);
+ if (QScriptEnginePrivate::convert(value, targetType, v.data(), this))
+ return v;
+ if (uint(targetType) == QVariant::LastType)
+ return value.toVariant();
+ if (value.isVariant()) {
+ v = value.toVariant();
+ if (v.canConvert(QVariant::Type(targetType))) {
+ v.convert(QVariant::Type(targetType));
+ return v;
+ }
+ QByteArray typeName = v.typeName();
+ if (typeName.endsWith('*')
+ && (QMetaType::type(typeName.left(typeName.size()-1)) == targetType)) {
+ return QVariant(targetType, *reinterpret_cast<void* *>(v.data()));
+ }
+ }
+
+ return QVariant();
+}
+
+JSC::JSValue QScriptEnginePrivate::jscValueFromVariant(const QVariant &v)
+{
+ // ### it's inefficient to convert to QScriptValue and then to JSValue
+ QScriptValue vv = scriptValueFromVariant(v);
+ QScriptValuePrivate *p = QScriptValuePrivate::get(vv);
+ switch (p->type) {
+ case QScriptValuePrivate::JSC:
+ return p->jscValue;
+ case QScriptValuePrivate::Number:
+ return JSC::jsNumber(globalObject->globalExec(), p->numberValue);
+ case QScriptValuePrivate::String: {
+ JSC::UString str = QScript::qtStringToJSCUString(*p->stringValue);
+ return JSC::jsString(globalObject->globalExec(), str);
+ }
+ }
+ return JSC::JSValue();
+}
+
+QVariant QScriptEnginePrivate::jscValueToVariant(JSC::JSValue value, int targetType)
+{
+ // ### it's inefficient to convert to QScriptValue and then to QVariant
+ return scriptValueToVariant(scriptValueFromJSCValue(value), targetType);
+}
+
+QScriptValue QScriptEnginePrivate::arrayFromStringList(const QStringList &lst)
+{
+ Q_Q(QScriptEngine);
+ QScriptValue arr = q->newArray(lst.size());
+ for (int i = 0; i < lst.size(); ++i)
+ arr.setProperty(i, QScriptValue(q, lst.at(i)));
+ return arr;
+}
+
+QStringList QScriptEnginePrivate::stringListFromArray(const QScriptValue &arr)
+{
+ QStringList lst;
+ uint len = arr.property(QLatin1String("length")).toUInt32();
+ for (uint i = 0; i < len; ++i)
+ lst.append(arr.property(i).toString());
+ return lst;
+}
+
+QScriptValue QScriptEnginePrivate::arrayFromVariantList(const QVariantList &lst)
+{
+ Q_Q(QScriptEngine);
+ QScriptValue arr = q->newArray(lst.size());
+ for (int i = 0; i < lst.size(); ++i)
+ arr.setProperty(i, scriptValueFromVariant(lst.at(i)));
+ return arr;
+}
+
+QVariantList QScriptEnginePrivate::variantListFromArray(const QScriptValue &arr)
+{
+ QVariantList lst;
+ uint len = arr.property(QLatin1String("length")).toUInt32();
+ for (uint i = 0; i < len; ++i)
+ lst.append(arr.property(i).toVariant());
+ return lst;
+}
+
+QScriptValue QScriptEnginePrivate::objectFromVariantMap(const QVariantMap &vmap)
+{
+ Q_Q(QScriptEngine);
+ QScriptValue obj = q->newObject();
+ QVariantMap::const_iterator it;
+ for (it = vmap.constBegin(); it != vmap.constEnd(); ++it)
+ obj.setProperty(it.key(), scriptValueFromVariant(it.value()));
+ return obj;
+}
+
+QVariantMap QScriptEnginePrivate::variantMapFromObject(const QScriptValue &obj)
+{
+ QVariantMap vmap;
+ QScriptValueIterator it(obj);
+ while (it.hasNext()) {
+ it.next();
+ vmap.insert(it.name(), it.value().toVariant());
+ }
+ return vmap;
+}
+
+#ifndef QT_NO_QOBJECT
+
+JSC::JSValue QScriptEnginePrivate::newQObject(
+ QObject *object, QScriptEngine::ValueOwnership ownership,
+ const QScriptEngine::QObjectWrapOptions &options)
+{
+ if (!object)
+ return JSC::jsNull();
+ JSC::ExecState* exec = globalObject->globalExec();
+ QScript::QObjectWrapperObject *result = new (exec) QScript::QObjectWrapperObject(object, ownership, options, qobjectWrapperObjectStructure);
+ return result;
+}
+
+bool QScriptEnginePrivate::convertToNativeQObject(const QScriptValue &value,
+ const QByteArray &targetType,
+ void **result)
+{
+ if (!targetType.endsWith('*'))
+ return false;
+ if (QObject *qobject = value.toQObject()) {
+ int start = targetType.startsWith("const ") ? 6 : 0;
+ QByteArray className = targetType.mid(start, targetType.size()-start-1);
+ if (void *instance = qobject->qt_metacast(className)) {
+ *result = instance;
+ return true;
+ }
+ }
+ return false;
+}
+
+QScript::QObjectData *QScriptEnginePrivate::qobjectData(QObject *object)
+{
+ QHash<QObject*, QScript::QObjectData*>::const_iterator it;
+ it = m_qobjectData.constFind(object);
+ if (it != m_qobjectData.constEnd())
+ return it.value();
+
+ QScript::QObjectData *data = new QScript::QObjectData(this);
+ m_qobjectData.insert(object, data);
+ QObject::connect(object, SIGNAL(destroyed(QObject*)),
+ q_func(), SLOT(_q_objectDestroyed(QObject *)));
+ return data;
+}
+
+void QScriptEnginePrivate::_q_objectDestroyed(QObject *object)
+{
+ QHash<QObject*, QScript::QObjectData*>::iterator it;
+ it = m_qobjectData.find(object);
+ Q_ASSERT(it != m_qobjectData.end());
+ QScript::QObjectData *data = it.value();
+ m_qobjectData.erase(it);
+ delete data;
+}
+
+void QScriptEnginePrivate::disposeQObject(QObject *object)
+{
+ // TODO
+/* if (isCollecting()) {
+ // wait until we're done with GC before deleting it
+ int index = m_qobjectsToBeDeleted.indexOf(object);
+ if (index == -1)
+ m_qobjectsToBeDeleted.append(object);
+ } else*/ {
+ delete object;
+ }
+}
+
+void QScriptEnginePrivate::emitSignalHandlerException()
+{
+ Q_Q(QScriptEngine);
+ emit q->signalHandlerException(q->uncaughtException());
+}
+
+#endif
+
+QScriptEnginePrivate *QScriptEnginePrivate::get(QScriptEngine *q)
+{
+ if (!q)
+ return 0;
+ return q->d_func();
+}
+
+QScriptEngine *QScriptEnginePrivate::get(QScriptEnginePrivate *d)
+{
+ if (!d)
+ return 0;
+ return d->q_func();
+}
+
#ifdef QT_NO_QOBJECT
QScriptEngine::QScriptEngine()
: d_ptr(new QScriptEnginePrivate)
{
d_ptr->q_ptr = this;
- d_ptr->init();
}
/*! \internal
@@ -281,7 +683,6 @@ QScriptEngine::QScriptEngine(QScriptEnginePrivate &dd)
: d_ptr(&dd)
{
d_ptr->q_ptr = this;
- d_ptr->init();
}
#else
@@ -294,8 +695,6 @@ QScriptEngine::QScriptEngine(QScriptEnginePrivate &dd)
QScriptEngine::QScriptEngine()
: QObject(*new QScriptEnginePrivate, 0)
{
- Q_D(QScriptEngine);
- d->init();
}
/*!
@@ -308,8 +707,6 @@ QScriptEngine::QScriptEngine()
QScriptEngine::QScriptEngine(QObject *parent)
: QObject(*new QScriptEnginePrivate, parent)
{
- Q_D(QScriptEngine);
- d->init();
}
/*! \internal
@@ -317,8 +714,6 @@ QScriptEngine::QScriptEngine(QObject *parent)
QScriptEngine::QScriptEngine(QScriptEnginePrivate &dd, QObject *parent)
: QObject(dd, parent)
{
- Q_D(QScriptEngine);
- d->init();
}
#endif
@@ -327,9 +722,6 @@ QScriptEngine::QScriptEngine(QScriptEnginePrivate &dd, QObject *parent)
*/
QScriptEngine::~QScriptEngine()
{
- Q_D(QScriptEngine);
- d->m_frameRepository.release(currentContext());
- d->objectAllocator.destruct();
#ifdef QT_NO_QOBJECT
delete d_ptr;
d_ptr = 0;
@@ -349,7 +741,7 @@ QScriptEngine::~QScriptEngine()
QScriptValue QScriptEngine::globalObject() const
{
Q_D(const QScriptEngine);
- return const_cast<QScriptEnginePrivate*>(d)->toPublic(d->m_globalObject);
+ return const_cast<QScriptEnginePrivate*>(d)->scriptValueFromJSCValue(d->globalObject);
}
/*!
@@ -366,24 +758,9 @@ QScriptValue QScriptEngine::globalObject() const
*/
void QScriptEngine::setGlobalObject(const QScriptValue &object)
{
- Q_D(QScriptEngine);
- if (!object.isObject())
- return;
- QScriptValueImpl objectImpl = d->toImpl(object);
-
- // update properties of the global context
- QScriptValueImpl old = d->m_globalObject;
- QScriptContextPrivate *ctx = d->currentContext();
- while (ctx->parentContext() != 0)
- ctx = ctx->parentContext();
- if (QScriptEnginePrivate::strictlyEquals(ctx->m_thisObject, old))
- ctx->m_thisObject = objectImpl;
- if (QScriptEnginePrivate::strictlyEquals(ctx->m_activation, old))
- ctx->m_activation = objectImpl;
- if (QScriptEnginePrivate::strictlyEquals(ctx->m_scopeChain, old))
- ctx->m_scopeChain = objectImpl;
-
- d->m_globalObject = objectImpl;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // not possible with JSC?
+ Q_UNUSED(object);
}
/*!
@@ -394,7 +771,7 @@ void QScriptEngine::setGlobalObject(const QScriptValue &object)
QScriptValue QScriptEngine::nullValue()
{
Q_D(QScriptEngine);
- return d->toPublic(d->nullValue());
+ return d->scriptValueFromJSCValue(JSC::jsNull());
}
/*!
@@ -405,7 +782,7 @@ QScriptValue QScriptEngine::nullValue()
QScriptValue QScriptEngine::undefinedValue()
{
Q_D(QScriptEngine);
- return d->toPublic(d->undefinedValue());
+ return d->scriptValueFromJSCValue(JSC::jsUndefined());
}
/*!
@@ -438,14 +815,13 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun,
int length)
{
Q_D(QScriptEngine);
- QScriptValueImpl v = d->createFunction(new QScript::CFunction(fun, length));
- QScriptValueImpl proto = d->toImpl(prototype);
- v.setProperty(d->idTable()->id_prototype, proto,
- QScriptValue::Undeletable);
- proto.setProperty(d->idTable()->id_constructor, v,
- QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration);
- return d->toPublic(v);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSValue function = new (exec)QScript::FunctionWrapper(this, length, JSC::Identifier(exec, ""), fun);
+ QScriptValue result = d->scriptValueFromJSCValue(function);
+ result.setProperty(QLatin1String("prototype"), prototype);
+ const_cast<QScriptValue&>(prototype)
+ .setProperty(QLatin1String("constructor"), result, QScriptValue::SkipInEnumeration);
+ return result;
}
#ifndef QT_NO_REGEXP
@@ -458,9 +834,18 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun,
QScriptValue QScriptEngine::newRegExp(const QRegExp &regexp)
{
Q_D(QScriptEngine);
- QScriptValueImpl v;
- d->regexpConstructor->newRegExp(&v, regexp);
- return d->toPublic(v);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSValue buf[2];
+ JSC::ArgList args(buf, sizeof(buf));
+ JSC::UString jscPattern = QScript::qtStringToJSCUString(regexp.pattern());
+ QString flags;
+ if (regexp.caseSensitivity() == Qt::CaseInsensitive)
+ flags.append(QLatin1Char('i'));
+ JSC::UString jscFlags = QScript::qtStringToJSCUString(flags);
+ buf[0] = JSC::jsNontrivialString(exec, jscPattern);
+ buf[1] = JSC::jsNontrivialString(exec, jscFlags);
+ JSC::JSObject* result = JSC::constructRegExp(exec, args);
+ return d->scriptValueFromJSCValue(result);
}
#endif // QT_NO_REGEXP
@@ -478,9 +863,14 @@ QScriptValue QScriptEngine::newRegExp(const QRegExp &regexp)
QScriptValue QScriptEngine::newVariant(const QVariant &value)
{
Q_D(QScriptEngine);
- QScriptValueImpl result;
- d->newVariant(&result, value);
- return d->toPublic(result);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ QScript::QVariantWrapperObject *obj = new (exec) QScript::QVariantWrapperObject(d->variantWrapperObjectStructure);
+ obj->setValue(value);
+ QScriptValue result = d->scriptValueFromJSCValue(obj);
+ QScriptValue proto = defaultPrototype(value.userType());
+ if (proto.isValid())
+ result.setPrototype(proto);
+ return result;
}
/*!
@@ -510,15 +900,10 @@ QScriptValue QScriptEngine::newVariant(const QVariant &value)
QScriptValue QScriptEngine::newVariant(const QScriptValue &object,
const QVariant &value)
{
- Q_D(QScriptEngine);
- QScriptValuePrivate *p = QScriptValuePrivate::get(object);
- if (!p || !p->value.isObject())
- return newVariant(value);
- if (p->value.isVariant())
- p->value.setVariantValue(value);
- else
- d->newVariant(&p->value, value, /*setDefaultPrototype=*/false);
- return object;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(object);
+ Q_UNUSED(value);
+ return QScriptValue();
}
#ifndef QT_NO_QOBJECT
@@ -548,9 +933,8 @@ QScriptValue QScriptEngine::newQObject(QObject *object, ValueOwnership ownership
const QObjectWrapOptions &options)
{
Q_D(QScriptEngine);
- QScriptValueImpl result;
- d->newQObject(&result, object, ownership, options);
- return d->toPublic(result);
+ JSC::JSValue jscQObject = d->newQObject(object, ownership, options);
+ return d->scriptValueFromJSCValue(jscQObject);
}
/*!
@@ -583,22 +967,12 @@ QScriptValue QScriptEngine::newQObject(const QScriptValue &scriptObject,
ValueOwnership ownership,
const QObjectWrapOptions &options)
{
- Q_D(QScriptEngine);
- QScriptValuePrivate *p = QScriptValuePrivate::get(scriptObject);
- if (!p || !p->value.isObject())
- return newQObject(qtObject, ownership, options);
- if (p->value.isQObject()) {
- QScript::ExtQObject::Instance *data;
- data = d->qobjectConstructor->get(p->value);
- Q_ASSERT(data != 0);
- data->value = qtObject;
- data->ownership = ownership;
- data->options = options;
- } else {
- d->newQObject(&p->value, qtObject, ownership, options,
- /*setDefaultPrototype=*/false);
- }
- return scriptObject;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(scriptObject);
+ Q_UNUSED(qtObject);
+ Q_UNUSED(ownership);
+ Q_UNUSED(options);
+ return QScriptValue();
}
#endif // QT_NO_QOBJECT
@@ -614,9 +988,9 @@ QScriptValue QScriptEngine::newQObject(const QScriptValue &scriptObject,
QScriptValue QScriptEngine::newObject()
{
Q_D(QScriptEngine);
- QScriptValueImpl v;
- d->newObject(&v, d->objectConstructor->publicPrototype);
- return d->toPublic(v);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSObject *result = JSC::constructEmptyObject(exec);
+ return d->scriptValueFromJSCValue(result);
}
/*!
@@ -636,8 +1010,11 @@ QScriptValue QScriptEngine::newObject()
QScriptValue QScriptEngine::newObject(QScriptClass *scriptClass,
const QScriptValue &data)
{
- Q_D(QScriptEngine);
- return d->toPublic(d->newObject(scriptClass, d->toImpl(data)));
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // use an internal map from JSObject -> data
+ Q_UNUSED(scriptClass);
+ Q_UNUSED(data);
+ return QScriptValue();
}
/*!
@@ -645,10 +1022,9 @@ QScriptValue QScriptEngine::newObject(QScriptClass *scriptClass,
*/
QScriptValue QScriptEngine::newActivationObject()
{
- Q_D(QScriptEngine);
- QScriptValueImpl v;
- d->newActivation(&v);
- return d->toPublic(v);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // ### JSActivation or JSVariableObject?
+ return QScriptValue();
}
/*!
@@ -697,12 +1073,14 @@ QScriptValue QScriptEngine::newActivationObject()
QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, int length)
{
Q_D(QScriptEngine);
- QScriptValueImpl v = d->createFunction(new QScript::CFunction(fun, length));
- QScriptValueImpl prototype = d->newObject();
- v.setProperty(d->idTable()->id_prototype, prototype, QScriptValue::Undeletable);
- prototype.setProperty(d->idTable()->id_constructor, v,
- QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
- return d->toPublic(v);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSValue function = new (exec)QScript::FunctionWrapper(this, length, JSC::Identifier(exec, ""), fun);
+ QScriptValue result = d->scriptValueFromJSCValue(function);
+ QScriptValue proto = newObject();
+ result.setProperty(QLatin1String("prototype"), proto, QScriptValue::Undeletable);
+ proto.setProperty(QLatin1String("constructor"), result,
+ QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ return result;
}
/*!
@@ -712,12 +1090,14 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, in
QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionWithArgSignature fun, void *arg)
{
Q_D(QScriptEngine);
- QScriptValueImpl v = d->createFunction(new QScript::C3Function(fun, arg, /*length=*/0));
- QScriptValueImpl prototype = d->newObject();
- v.setProperty(d->idTable()->id_prototype, prototype, QScriptValue::Undeletable);
- prototype.setProperty(d->idTable()->id_constructor, v,
- QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
- return d->toPublic(v);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSValue function = new (exec)QScript::FunctionWithArgWrapper(this, /*length=*/0, JSC::Identifier(exec, ""), fun, arg);
+ QScriptValue result = d->scriptValueFromJSCValue(function);
+ QScriptValue proto = newObject();
+ result.setProperty(QLatin1String("prototype"), proto, QScriptValue::Undeletable);
+ proto.setProperty(QLatin1String("constructor"), result,
+ QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ return result;
}
/*!
@@ -728,11 +1108,9 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionWithArgSignature
QScriptValue QScriptEngine::newArray(uint length)
{
Q_D(QScriptEngine);
- QScriptValueImpl v;
- QScript::Array a(d);
- a.resize(length);
- d->newArray(&v, a);
- return d->toPublic(v);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSArray* result = JSC::constructEmptyArray(exec, length);
+ return d->scriptValueFromJSCValue(result);
}
/*!
@@ -745,12 +1123,15 @@ QScriptValue QScriptEngine::newArray(uint length)
QScriptValue QScriptEngine::newRegExp(const QString &pattern, const QString &flags)
{
Q_D(QScriptEngine);
- int bitflags = 0;
- for (int i = 0; i < flags.size(); ++i)
- bitflags |= QScript::Ecma::RegExp::flagFromChar(flags.at(i));
- QScriptValueImpl v;
- d->regexpConstructor->newRegExp(&v, pattern, bitflags);
- return d->toPublic(v);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSValue buf[2];
+ JSC::ArgList args(buf, sizeof(buf));
+ JSC::UString jscPattern = QScript::qtStringToJSCUString(pattern);
+ JSC::UString jscFlags = QScript::qtStringToJSCUString(flags);
+ buf[0] = JSC::jsNontrivialString(exec, jscPattern);
+ buf[1] = JSC::jsNontrivialString(exec, jscFlags);
+ JSC::JSObject* result = JSC::constructRegExp(exec, args);
+ return d->scriptValueFromJSCValue(result);
}
/*!
@@ -761,9 +1142,11 @@ QScriptValue QScriptEngine::newRegExp(const QString &pattern, const QString &fla
QScriptValue QScriptEngine::newDate(qsreal value)
{
Q_D(QScriptEngine);
- QScriptValueImpl v;
- d->dateConstructor->newDate(&v, value);
- return d->toPublic(v);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSValue val = JSC::jsNumber(exec, value);
+ JSC::ArgList args(&val, 1);
+ JSC::JSObject *result = JSC::constructDate(exec, args);
+ return d->scriptValueFromJSCValue(result);
}
/*!
@@ -773,10 +1156,7 @@ QScriptValue QScriptEngine::newDate(qsreal value)
*/
QScriptValue QScriptEngine::newDate(const QDateTime &value)
{
- Q_D(QScriptEngine);
- QScriptValueImpl v;
- d->dateConstructor->newDate(&v, value);
- return d->toPublic(v);
+ return newDate(QScript::FromDateTime(value));
}
#ifndef QT_NO_QOBJECT
@@ -798,10 +1178,10 @@ QScriptValue QScriptEngine::newDate(const QDateTime &value)
QScriptValue QScriptEngine::newQMetaObject(
const QMetaObject *metaObject, const QScriptValue &ctor)
{
- Q_D(QScriptEngine);
- QScriptValueImpl v;
- d->qmetaObjectConstructor->newQMetaObject(&v, metaObject, d->toImpl(ctor));
- return d->toPublic(v);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(metaObject);
+ Q_UNUSED(ctor);
+ return QScriptValue();
}
/*!
@@ -896,7 +1276,10 @@ QScriptValue QScriptEngine::newQMetaObject(
*/
bool QScriptEngine::canEvaluate(const QString &program) const
{
- return QScriptEnginePrivate::canEvaluate(program);
+// Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // ### use our own parser or JSC::Interpreter::checkSyntax()
+ Q_UNUSED(program);
+ return true;
}
/*!
@@ -907,7 +1290,9 @@ bool QScriptEngine::canEvaluate(const QString &program) const
*/
QScriptSyntaxCheckResult QScriptEngine::checkSyntax(const QString &program)
{
- return QScriptEnginePrivate::checkSyntax(program);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // use our own parser or JSC::Interpreter::checkSyntax()
+ Q_UNUSED(program);
}
/*!
@@ -940,9 +1325,24 @@ QScriptSyntaxCheckResult QScriptEngine::checkSyntax(const QString &program)
QScriptValue QScriptEngine::evaluate(const QString &program, const QString &fileName, int lineNumber)
{
Q_D(QScriptEngine);
- QScriptContextPrivate *ctx_p = d->currentContext();
- d->evaluate(ctx_p, program, lineNumber, fileName);
- return d->toPublic(ctx_p->m_result);
+
+ JSC::JSLock lock(false); // ### hmmm
+
+ JSC::UString jscProgram = QScript::qtStringToJSCUString(program);
+ JSC::UString jscFileName = QScript::qtStringToJSCUString(fileName);
+
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::Completion comp = JSC::evaluate(exec, exec->dynamicGlobalObject()->globalScopeChain(),
+ JSC::makeSource(jscProgram, jscFileName, lineNumber));
+ if ((comp.complType() == JSC::Normal) || (comp.complType() == JSC::ReturnValue)) {
+ return d->scriptValueFromJSCValue(comp.value());
+ }
+
+ if (comp.complType() == JSC::Throw) {
+ return d->scriptValueFromJSCValue(comp.value());
+ }
+
+ return QScriptValue();
}
/*!
@@ -954,8 +1354,8 @@ QScriptValue QScriptEngine::evaluate(const QString &program, const QString &file
*/
QScriptContext *QScriptEngine::currentContext() const
{
- Q_D(const QScriptEngine);
- return QScriptContextPrivate::get(d->currentContext());
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return 0;
}
/*!
@@ -983,14 +1383,8 @@ QScriptContext *QScriptEngine::currentContext() const
*/
QScriptContext *QScriptEngine::pushContext()
{
- Q_D(QScriptEngine);
- QScriptContextPrivate *ctx_p = d->pushContext();
- ctx_p->setThisObject(d->globalObject());
- QScriptValueImpl activation;
- d->newActivation(&activation);
- activation.setScope(d->globalObject());
- ctx_p->setActivationObject(activation);
- return QScriptContextPrivate::get(ctx_p);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return 0;
}
/*!
@@ -1001,9 +1395,7 @@ QScriptContext *QScriptEngine::pushContext()
*/
void QScriptEngine::popContext()
{
- Q_D(QScriptEngine);
- if (d->currentContext() && d->currentContext()->parentContext())
- d->popContext();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
@@ -1018,7 +1410,8 @@ void QScriptEngine::popContext()
bool QScriptEngine::hasUncaughtException() const
{
Q_D(const QScriptEngine);
- return d->hasUncaughtException();
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ return exec->hadException();
}
/*!
@@ -1035,7 +1428,8 @@ bool QScriptEngine::hasUncaughtException() const
QScriptValue QScriptEngine::uncaughtException() const
{
Q_D(const QScriptEngine);
- return const_cast<QScriptEnginePrivate*>(d)->toPublic(d->uncaughtException());
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ return const_cast<QScriptEnginePrivate*>(d)->scriptValueFromJSCValue(exec->exception());
}
/*!
@@ -1048,7 +1442,9 @@ QScriptValue QScriptEngine::uncaughtException() const
*/
int QScriptEngine::uncaughtExceptionLineNumber() const
{
- return QScriptContextPrivate::get(currentContext())->errorLineNumber;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // use lineNumber property of exec->exception()?
+ return -1;
}
/*!
@@ -1060,8 +1456,9 @@ int QScriptEngine::uncaughtExceptionLineNumber() const
*/
QStringList QScriptEngine::uncaughtExceptionBacktrace() const
{
- Q_D(const QScriptEngine);
- return d->uncaughtExceptionBacktrace();
+// ### implement me
+ // how do we get a bt with JSC?
+ return QStringList() << QLatin1String("<backtrace should go here>");
}
/*!
@@ -1073,8 +1470,9 @@ QStringList QScriptEngine::uncaughtExceptionBacktrace() const
*/
void QScriptEngine::clearExceptions()
{
- Q_D(QScriptEngine);
- d->clearExceptions();
+ Q_D(const QScriptEngine);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ exec->clearException();
}
/*!
@@ -1086,7 +1484,10 @@ void QScriptEngine::clearExceptions()
QScriptValue QScriptEngine::defaultPrototype(int metaTypeId) const
{
Q_D(const QScriptEngine);
- return const_cast<QScriptEnginePrivate*>(d)->toPublic(d->defaultPrototype(metaTypeId));
+ QScriptTypeInfo *info = d->m_typeInfos.value(metaTypeId);
+ if (!info)
+ return QScriptValue();
+ return info->prototype;
}
/*!
@@ -1112,7 +1513,12 @@ QScriptValue QScriptEngine::defaultPrototype(int metaTypeId) const
void QScriptEngine::setDefaultPrototype(int metaTypeId, const QScriptValue &prototype)
{
Q_D(QScriptEngine);
- d->setDefaultPrototype(metaTypeId, d->toImpl(prototype));
+ QScriptTypeInfo *info = d->m_typeInfos.value(metaTypeId);
+ if (!info) {
+ info = new QScriptTypeInfo();
+ d->m_typeInfos.insert(metaTypeId, info);
+ }
+ info->prototype = prototype;
}
/*!
@@ -1151,7 +1557,317 @@ void QScriptEngine::setDefaultPrototype(int metaTypeId, const QScriptValue &prot
QScriptValue QScriptEngine::create(int type, const void *ptr)
{
Q_D(QScriptEngine);
- return d->toPublic(d->create(type, ptr));
+ return d->create(type, ptr);
+}
+
+QScriptValue QScriptEnginePrivate::create(int type, const void *ptr)
+{
+ Q_ASSERT(ptr != 0);
+ QScriptValue result;
+ QScriptTypeInfo *info = m_typeInfos.value(type);
+ if (info && info->marshal) {
+ result = info->marshal(q_func(), ptr);
+ } else {
+ // check if it's one of the types we know
+ switch (QMetaType::Type(type)) {
+ case QMetaType::Void:
+ result = QScriptValue(QScriptValue::UndefinedValue);
+ break;
+ case QMetaType::Bool:
+ result = QScriptValue(*reinterpret_cast<const bool*>(ptr));
+ break;
+ case QMetaType::Int:
+ result = QScriptValue(*reinterpret_cast<const int*>(ptr));
+ break;
+ case QMetaType::UInt:
+ result = QScriptValue(*reinterpret_cast<const uint*>(ptr));
+ break;
+ case QMetaType::LongLong:
+ result = QScriptValue(qsreal(*reinterpret_cast<const qlonglong*>(ptr)));
+ break;
+ case QMetaType::ULongLong:
+#if defined(Q_OS_WIN) && defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 12008804
+#pragma message("** NOTE: You need the Visual Studio Processor Pack to compile support for 64bit unsigned integers.")
+ result = QScriptValue(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));
+#elif defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET)
+ result = QScriptValue(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));
+#else
+ result = QScriptValue(qsreal(*reinterpret_cast<const qulonglong*>(ptr)));
+#endif
+ break;
+ case QMetaType::Double:
+ result = QScriptValue(*reinterpret_cast<const double*>(ptr));
+ break;
+ case QMetaType::QString:
+ result = QScriptValue(q_func(), *reinterpret_cast<const QString*>(ptr));
+ break;
+ case QMetaType::Float:
+ result = QScriptValue(*reinterpret_cast<const float*>(ptr));
+ break;
+ case QMetaType::Short:
+ result = QScriptValue(*reinterpret_cast<const short*>(ptr));
+ break;
+ case QMetaType::UShort:
+ result = QScriptValue(*reinterpret_cast<const unsigned short*>(ptr));
+ break;
+ case QMetaType::Char:
+ result = QScriptValue(*reinterpret_cast<const char*>(ptr));
+ break;
+ case QMetaType::UChar:
+ result = QScriptValue(*reinterpret_cast<const unsigned char*>(ptr));
+ break;
+ case QMetaType::QChar:
+ result = QScriptValue((*reinterpret_cast<const QChar*>(ptr)).unicode());
+ break;
+ case QMetaType::QStringList:
+ result = arrayFromStringList(*reinterpret_cast<const QStringList *>(ptr));
+ break;
+ case QMetaType::QVariantList:
+ result = arrayFromVariantList(*reinterpret_cast<const QVariantList *>(ptr));
+ break;
+ case QMetaType::QVariantMap:
+ result = objectFromVariantMap(*reinterpret_cast<const QVariantMap *>(ptr));
+ break;
+ case QMetaType::QDateTime:
+ result = q_func()->newDate(*reinterpret_cast<const QDateTime *>(ptr));
+ break;
+ case QMetaType::QDate:
+ result = q_func()->newDate(QDateTime(*reinterpret_cast<const QDate *>(ptr)));
+ break;
+#ifndef QT_NO_REGEXP
+ case QMetaType::QRegExp:
+ result = q_func()->newRegExp(*reinterpret_cast<const QRegExp *>(ptr));
+ break;
+#endif
+#ifndef QT_NO_QOBJECT
+ case QMetaType::QObjectStar:
+ case QMetaType::QWidgetStar:
+ result = q_func()->newQObject(*reinterpret_cast<QObject* const *>(ptr));
+ break;
+#endif
+ default:
+ if (type == qMetaTypeId<QScriptValue>()) {
+ result = *reinterpret_cast<const QScriptValue*>(ptr);
+ if (!result.isValid())
+ result = QScriptValue(QScriptValue::UndefinedValue);
+ } else if (type == qMetaTypeId<QVariant>()) {
+ result = scriptValueFromVariant(*reinterpret_cast<const QVariant*>(ptr));
+ }
+
+#ifndef QT_NO_QOBJECT
+ // lazy registration of some common list types
+ else if (type == qMetaTypeId<QObjectList>()) {
+ qScriptRegisterSequenceMetaType<QObjectList>(q_func());
+ return create(type, ptr);
+ }
+#endif
+ else if (type == qMetaTypeId<QList<int> >()) {
+ qScriptRegisterSequenceMetaType<QList<int> >(q_func());
+ return create(type, ptr);
+ }
+
+ else {
+ QByteArray typeName = QMetaType::typeName(type);
+ if (typeName.endsWith('*') && !*reinterpret_cast<void* const *>(ptr))
+ result = QScriptValue(QScriptValue::NullValue);
+ else
+ result = q_func()->newVariant(QVariant(type, ptr));
+ }
+ }
+ }
+ if (result.isObject() && info && info->prototype.isValid())
+ result.setPrototype(info->prototype);
+ return result;
+}
+
+bool QScriptEnginePrivate::convert(const QScriptValue &value,
+ int type, void *ptr,
+ QScriptEnginePrivate *eng)
+{
+ if (!eng && value.engine())
+ eng = QScriptEnginePrivate::get(value.engine());
+ if (eng) {
+ QScriptTypeInfo *info = eng->m_typeInfos.value(type);
+ if (info && info->demarshal) {
+ info->demarshal(value, ptr);
+ return true;
+ }
+ }
+
+ // check if it's one of the types we know
+ switch (QMetaType::Type(type)) {
+ case QMetaType::Bool:
+ *reinterpret_cast<bool*>(ptr) = value.toBoolean();
+ return true;
+ case QMetaType::Int:
+ *reinterpret_cast<int*>(ptr) = value.toInt32();
+ return true;
+ case QMetaType::UInt:
+ *reinterpret_cast<uint*>(ptr) = value.toUInt32();
+ return true;
+ case QMetaType::LongLong:
+ *reinterpret_cast<qlonglong*>(ptr) = qlonglong(value.toInteger());
+ return true;
+ case QMetaType::ULongLong:
+ *reinterpret_cast<qulonglong*>(ptr) = qulonglong(value.toInteger());
+ return true;
+ case QMetaType::Double:
+ *reinterpret_cast<double*>(ptr) = value.toNumber();
+ return true;
+ case QMetaType::QString:
+ if (value.isUndefined() || value.isNull())
+ *reinterpret_cast<QString*>(ptr) = QString();
+ else
+ *reinterpret_cast<QString*>(ptr) = value.toString();
+ return true;
+ case QMetaType::Float:
+ *reinterpret_cast<float*>(ptr) = value.toNumber();
+ return true;
+ case QMetaType::Short:
+ *reinterpret_cast<short*>(ptr) = short(value.toInt32());
+ return true;
+ case QMetaType::UShort:
+ *reinterpret_cast<unsigned short*>(ptr) = value.toUInt16();
+ return true;
+ case QMetaType::Char:
+ *reinterpret_cast<char*>(ptr) = char(value.toInt32());
+ return true;
+ case QMetaType::UChar:
+ *reinterpret_cast<unsigned char*>(ptr) = (unsigned char)(value.toInt32());
+ return true;
+ case QMetaType::QChar:
+ if (value.isString()) {
+ QString str = value.toString();
+ *reinterpret_cast<QChar*>(ptr) = str.isEmpty() ? QChar() : str.at(0);
+ } else {
+ *reinterpret_cast<QChar*>(ptr) = QChar(value.toUInt16());
+ }
+ return true;
+ case QMetaType::QDateTime:
+ if (value.isDate()) {
+ *reinterpret_cast<QDateTime *>(ptr) = value.toDateTime();
+ return true;
+ } break;
+ case QMetaType::QDate:
+ if (value.isDate()) {
+ *reinterpret_cast<QDate *>(ptr) = value.toDateTime().date();
+ return true;
+ } break;
+#ifndef QT_NO_REGEXP
+ case QMetaType::QRegExp:
+ if (value.isRegExp()) {
+ *reinterpret_cast<QRegExp *>(ptr) = value.toRegExp();
+ return true;
+ } break;
+#endif
+#ifndef QT_NO_QOBJECT
+ case QMetaType::QObjectStar:
+ if (value.isQObject() || value.isNull()) {
+ *reinterpret_cast<QObject* *>(ptr) = value.toQObject();
+ return true;
+ } break;
+ case QMetaType::QWidgetStar:
+ if (value.isQObject() || value.isNull()) {
+ QObject *qo = value.toQObject();
+ if (!qo || qo->isWidgetType()) {
+ *reinterpret_cast<QWidget* *>(ptr) = reinterpret_cast<QWidget*>(qo);
+ return true;
+ }
+ } break;
+#endif
+ case QMetaType::QStringList:
+ if (value.isArray()) {
+ *reinterpret_cast<QStringList *>(ptr) = stringListFromArray(value);
+ return true;
+ } break;
+ case QMetaType::QVariantList:
+ if (value.isArray()) {
+ *reinterpret_cast<QVariantList *>(ptr) = variantListFromArray(value);
+ return true;
+ } break;
+ case QMetaType::QVariantMap:
+ if (value.isObject()) {
+ *reinterpret_cast<QVariantMap *>(ptr) = variantMapFromObject(value);
+ return true;
+ } break;
+ default:
+ ;
+ }
+
+ QByteArray name = QMetaType::typeName(type);
+#ifndef QT_NO_QOBJECT
+ if (convertToNativeQObject(value, name, reinterpret_cast<void* *>(ptr)))
+ return true;
+#endif
+ if (value.isVariant() && name.endsWith('*')) {
+ int valueType = QMetaType::type(name.left(name.size()-1));
+ QVariant var = value.toVariant();
+ if (valueType == var.userType()) {
+ *reinterpret_cast<void* *>(ptr) = var.data();
+ return true;
+ } else {
+ // look in the prototype chain
+ QScriptValue proto = value.prototype();
+ while (proto.isObject()) {
+ bool canCast = false;
+ if (proto.isVariant()) {
+ canCast = (type == proto.toVariant().userType())
+ || (valueType && (valueType == proto.toVariant().userType()));
+ }
+#ifndef QT_NO_QOBJECT
+ else if (proto.isQObject()) {
+ QByteArray className = name.left(name.size()-1);
+ if (QObject *qobject = proto.toQObject())
+ canCast = qobject->qt_metacast(className) != 0;
+ }
+#endif
+ if (canCast) {
+ QByteArray varTypeName = QMetaType::typeName(var.userType());
+ if (varTypeName.endsWith('*'))
+ *reinterpret_cast<void* *>(ptr) = *reinterpret_cast<void* *>(var.data());
+ else
+ *reinterpret_cast<void* *>(ptr) = var.data();
+ return true;
+ }
+ proto = proto.prototype();
+ }
+ }
+ } else if (value.isNull() && name.endsWith('*')) {
+ *reinterpret_cast<void* *>(ptr) = 0;
+ return true;
+ } else if (type == qMetaTypeId<QScriptValue>()) {
+ if (!eng)
+ return false;
+ *reinterpret_cast<QScriptValue*>(ptr) = value;
+ return true;
+ } else if (type == qMetaTypeId<QVariant>()) {
+ *reinterpret_cast<QVariant*>(ptr) = value.toVariant();
+ return true;
+ }
+
+ // lazy registration of some common list types
+#ifndef QT_NO_QOBJECT
+ else if (type == qMetaTypeId<QObjectList>()) {
+ if (!eng)
+ return false;
+ qScriptRegisterSequenceMetaType<QObjectList>(eng->q_func());
+ return convert(value, type, ptr, eng);
+ }
+#endif
+ else if (type == qMetaTypeId<QList<int> >()) {
+ if (!eng)
+ return false;
+ qScriptRegisterSequenceMetaType<QList<int> >(eng->q_func());
+ return convert(value, type, ptr, eng);
+ }
+
+#if 0
+ if (!name.isEmpty()) {
+ qWarning("QScriptEngine::convert: unable to convert value to type `%s'",
+ name.constData());
+ }
+#endif
+ return false;
}
/*!
@@ -1160,7 +1876,7 @@ QScriptValue QScriptEngine::create(int type, const void *ptr)
bool QScriptEngine::convert(const QScriptValue &value, int type, void *ptr)
{
Q_D(QScriptEngine);
- return QScriptEnginePrivate::convert(d->toImpl(value), type, ptr, d);
+ return QScriptEnginePrivate::convert(value, type, ptr, d);
}
/*!
@@ -1168,9 +1884,7 @@ bool QScriptEngine::convert(const QScriptValue &value, int type, void *ptr)
*/
bool QScriptEngine::convertV2(const QScriptValue &value, int type, void *ptr)
{
- QScriptValueImpl impl = QScriptValuePrivate::valueOf(value);
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(value.engine());
- return QScriptEnginePrivate::convert(impl, type, ptr, eng_p);
+ return QScriptEnginePrivate::convert(value, type, ptr, /*engine=*/0);
}
/*!
@@ -1181,11 +1895,14 @@ void QScriptEngine::registerCustomType(int type, MarshalFunction mf,
const QScriptValue &prototype)
{
Q_D(QScriptEngine);
- QScriptCustomTypeInfo info = d->m_customTypes.value(type);
- info.marshal = mf;
- info.demarshal = df;
- info.prototype = d->toImpl(prototype);
- d->m_customTypes.insert(type, info);
+ QScriptTypeInfo *info = d->m_typeInfos.value(type);
+ if (!info) {
+ info = new QScriptTypeInfo();
+ d->m_typeInfos.insert(type, info);
+ }
+ info->marshal = mf;
+ info->demarshal = df;
+ info->prototype = prototype;
}
/*!
@@ -1209,10 +1926,8 @@ void QScriptEngine::registerCustomType(int type, MarshalFunction mf,
*/
void QScriptEngine::installTranslatorFunctions(const QScriptValue &object)
{
- Q_D(QScriptEngine);
- QScriptValue target = object.isObject() ? object : globalObject();
- QScriptValueImpl impl = QScriptValuePrivate::valueOf(target);
- d->installTranslatorFunctions(impl);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(object);
}
/*!
@@ -1230,8 +1945,9 @@ void QScriptEngine::installTranslatorFunctions(const QScriptValue &object)
*/
QScriptValue QScriptEngine::importExtension(const QString &extension)
{
- Q_D(QScriptEngine);
- return d->toPublic(d->importExtension(extension));
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(extension);
+ return QScriptValue();
}
/*!
@@ -1245,8 +1961,8 @@ QScriptValue QScriptEngine::importExtension(const QString &extension)
*/
QStringList QScriptEngine::availableExtensions() const
{
- Q_D(const QScriptEngine);
- return d->availableExtensions();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QStringList();
}
/*!
@@ -1259,8 +1975,8 @@ QStringList QScriptEngine::availableExtensions() const
*/
QStringList QScriptEngine::importedExtensions() const
{
- Q_D(const QScriptEngine);
- return d->importedExtensions();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QStringList();
}
/*! \fn QScriptValue QScriptEngine::toScriptValue(const T &value)
@@ -1316,7 +2032,7 @@ QStringList QScriptEngine::importedExtensions() const
*/
/*!
- \fn T qScriptValueToValue<T>(const QScriptValue &value)
+ \fn T qScriptValueToValue(const QScriptValue &value)
\since 4.3
\relates QScriptEngine
@@ -1371,7 +2087,7 @@ QStringList QScriptEngine::importedExtensions() const
*/
/*!
- \fn T qscriptvalue_cast<T>(const QScriptValue &value)
+ \fn T qscriptvalue_cast(const QScriptValue &value)
\since 4.3
\relates QScriptValue
@@ -1510,7 +2226,9 @@ QStringList QScriptEngine::importedExtensions() const
void QScriptEngine::collectGarbage()
{
Q_D(QScriptEngine);
- d->gc();
+ JSC::JSLock lock(false);
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ exec->heap()->collect();
}
/*!
@@ -1539,7 +2257,12 @@ void QScriptEngine::collectGarbage()
void QScriptEngine::setProcessEventsInterval(int interval)
{
Q_D(QScriptEngine);
- d->m_processEventsInterval = interval;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // is it possible with JSC?
+ // JSC has some code for detecting timeouts but not for getting
+ // a callback at fixed intervals.
+ // ### we can install a JSC "debugger client"
+ d->processEventsInterval = interval;
}
/*!
@@ -1552,7 +2275,7 @@ void QScriptEngine::setProcessEventsInterval(int interval)
int QScriptEngine::processEventsInterval() const
{
Q_D(const QScriptEngine);
- return d->m_processEventsInterval;
+ return d->processEventsInterval;
}
/*!
@@ -1565,8 +2288,9 @@ int QScriptEngine::processEventsInterval() const
*/
bool QScriptEngine::isEvaluating() const
{
- Q_D(const QScriptEngine);
- return d->m_evaluating;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // check whether we have a lock on the exec state?
+ return false;
}
/*!
@@ -1587,8 +2311,8 @@ bool QScriptEngine::isEvaluating() const
*/
void QScriptEngine::abortEvaluation(const QScriptValue &result)
{
- Q_D(QScriptEngine);
- d->abortEvaluation(d->toImpl(result));
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(result);
}
#ifndef QT_NO_QOBJECT
@@ -1613,10 +2337,17 @@ bool qScriptConnect(QObject *sender, const char *signal,
return false;
if (receiver.isObject() && (receiver.engine() != function.engine()))
return false;
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(function.engine());
- return eng_p->scriptConnect(sender, signal,
- eng_p->toImpl(receiver),
- eng_p->toImpl(function));
+ QScriptEnginePrivate *engine = QScriptEnginePrivate::get(function.engine());
+ JSC::JSValue jscReceiver(engine->scriptValueToJSCValue(receiver));
+ JSC::JSValue jscFunction(engine->scriptValueToJSCValue(function));
+ QScript::QObjectData *data = engine->qobjectData(sender);
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // ### FIXME
+ // return data->addSignalHandler(sender, signal, jscReceiver, jscFunction);
+
+ return false;
+
}
/*!
@@ -1638,10 +2369,11 @@ bool qScriptDisconnect(QObject *sender, const char *signal,
return false;
if (receiver.isObject() && (receiver.engine() != function.engine()))
return false;
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(function.engine());
- return eng_p->scriptDisconnect(sender, signal,
- eng_p->toImpl(receiver),
- eng_p->toImpl(function));
+ QScriptEnginePrivate *engine = QScriptEnginePrivate::get(function.engine());
+ JSC::JSValue jscReceiver = engine->scriptValueToJSCValue(receiver);
+ JSC::JSValue jscFunction = engine->scriptValueToJSCValue(function);
+ QScript::QObjectData *data = engine->qobjectData(sender);
+ return data->removeSignalHandler(sender, signal, jscReceiver, jscFunction);
}
/*!
@@ -1678,7 +2410,8 @@ QT_END_INCLUDE_NAMESPACE
void QScriptEngine::setAgent(QScriptEngineAgent *agent)
{
Q_D(QScriptEngine);
- d->setAgent(agent);
+ d->agent = agent;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
@@ -1692,7 +2425,7 @@ void QScriptEngine::setAgent(QScriptEngineAgent *agent)
QScriptEngineAgent *QScriptEngine::agent() const
{
Q_D(const QScriptEngine);
- return d->agent();
+ return d->agent;
}
/*!
@@ -1707,8 +2440,9 @@ QScriptEngineAgent *QScriptEngine::agent() const
*/
QScriptString QScriptEngine::toStringHandle(const QString &str)
{
- Q_D(QScriptEngine);
- return d->internedString(str);
+ QScriptString ss;
+ QScriptStringPrivate::init(ss, str);
+ return ss;
}
/*!
@@ -1733,7 +2467,12 @@ QScriptString QScriptEngine::toStringHandle(const QString &str)
QScriptValue QScriptEngine::toObject(const QScriptValue &value)
{
Q_D(QScriptEngine);
- return d->toPublic(d->toObject(d->toImpl(value)));
+ JSC::JSValue jscValue = d->scriptValueToJSCValue(value);
+ if (!jscValue)
+ return QScriptValue();
+ JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::JSValue result = jscValue.toObject(exec);
+ return d->scriptValueFromJSCValue(result);
}
/*!
@@ -1746,8 +2485,10 @@ QScriptValue QScriptEngine::toObject(const QScriptValue &value)
*/
QScriptValue QScriptEngine::objectById(qint64 id) const
{
- Q_D(const QScriptEngine);
- return const_cast<QScriptEnginePrivate*>(d)->toPublic(d->objectById(id));
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // mapping from id to JSObject*?
+ Q_UNUSED(id);
+ return QScriptValue();
}
/*!
@@ -1773,6 +2514,19 @@ QScriptValue QScriptEngine::objectById(qint64 id) const
\value Valid The program is a syntactically correct Qt Script program.
*/
+class QScriptSyntaxCheckResultPrivate
+{
+public:
+ QScriptSyntaxCheckResultPrivate() { ref = 0; }
+ ~QScriptSyntaxCheckResultPrivate() {}
+
+ QScriptSyntaxCheckResult::State state;
+ int errorColumnNumber;
+ int errorLineNumber;
+ QString errorMessage;
+ QBasicAtomicInt ref;
+};
+
/*!
Constructs a new QScriptSyntaxCheckResult from the \a other result.
*/
diff --git a/src/script/qscriptengine.h b/src/script/api/qscriptengine.h
index afd551b..f293325 100644
--- a/src/script/qscriptengine.h
+++ b/src/script/api/qscriptengine.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -363,7 +333,7 @@ inline bool qscriptvalue_cast_helper(const QScriptValue &value, int type, void *
template<typename T>
T qscriptvalue_cast(const QScriptValue &value
-#if !defined qdoc && defined Q_CC_MSVC && _MSC_VER < 1300
+#ifndef Q_QDOC
, T * = 0
#endif
)
@@ -379,13 +349,11 @@ T qscriptvalue_cast(const QScriptValue &value
return T();
}
-#if !defined Q_CC_MSVC || _MSC_VER >= 1300
template <>
-inline QVariant qscriptvalue_cast<QVariant>(const QScriptValue &value)
+inline QVariant qscriptvalue_cast<QVariant>(const QScriptValue &value, QVariant *)
{
return value.toVariant();
}
-#endif
template <typename T>
inline T qScriptValueToValue(const QScriptValue &value)
diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h
new file mode 100644
index 0000000..13a71a7
--- /dev/null
+++ b/src/script/api/qscriptengine_p.h
@@ -0,0 +1,157 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTENGINE_P_H
+#define QSCRIPTENGINE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "private/qobject_p.h"
+
+#ifndef QT_NO_SCRIPT
+
+#include <QtCore/qhash.h>
+
+#include "RefPtr.h"
+#include "Structure.h"
+#include "JSGlobalObject.h"
+#include "JSValue.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace JSC
+{
+ class JSGlobalObject;
+ class UString;
+}
+
+namespace QScript
+{
+ class QObjectPrototype;
+ class QVariantPrototype;
+#ifndef QT_NO_QOBJECT
+ class QObjectData;
+#endif
+}
+
+class QString;
+class QStringList;
+class QScriptValue;
+class QScriptTypeInfo;
+class QScriptEngineAgent;
+
+class QScriptEngine;
+class QScriptEnginePrivate
+#ifndef QT_NO_QOBJECT
+ : public QObjectPrivate
+#endif
+{
+ Q_DECLARE_PUBLIC(QScriptEngine)
+public:
+ QScriptEnginePrivate();
+ virtual ~QScriptEnginePrivate();
+
+ static QScriptEnginePrivate *get(QScriptEngine*);
+ static QScriptEngine *get(QScriptEnginePrivate*);
+
+ static bool convert(const QScriptValue &value,
+ int type, void *ptr,
+ QScriptEnginePrivate *eng);
+ QScriptValue create(int type, const void *ptr);
+
+ QScriptValue scriptValueFromJSCValue(JSC::JSValue value);
+ JSC::JSValue scriptValueToJSCValue(const QScriptValue &value);
+ void releaseJSCValue(JSC::JSValue value);
+
+ QScriptValue scriptValueFromVariant(const QVariant &value);
+ QVariant scriptValueToVariant(const QScriptValue &value, int targetType);
+
+ JSC::JSValue jscValueFromVariant(const QVariant &value);
+ QVariant jscValueToVariant(JSC::JSValue value, int targetType);
+
+ QScriptValue arrayFromStringList(const QStringList &lst);
+ static QStringList stringListFromArray(const QScriptValue &arr);
+
+ QScriptValue arrayFromVariantList(const QVariantList &lst);
+ static QVariantList variantListFromArray(const QScriptValue &arr);
+
+ QScriptValue objectFromVariantMap(const QVariantMap &vmap);
+ static QVariantMap variantMapFromObject(const QScriptValue &obj);
+
+#ifndef QT_NO_QOBJECT
+ JSC::JSValue newQObject(QObject *object,
+ QScriptEngine::ValueOwnership ownership = QScriptEngine::QtOwnership,
+ const QScriptEngine:: QObjectWrapOptions &options = 0);
+
+ static bool convertToNativeQObject(const QScriptValue &value,
+ const QByteArray &targetType,
+ void **result);
+
+ QScript::QObjectData *qobjectData(QObject *object);
+ void disposeQObject(QObject *object);
+ void emitSignalHandlerException();
+
+ // private slots
+ void _q_objectDestroyed(QObject *);
+#endif
+
+ JSC::JSGlobalObject *globalObject;
+
+ QScript::QObjectPrototype *qobjectPrototype;
+ WTF::RefPtr<JSC::Structure> qobjectWrapperObjectStructure;
+ QScript::QVariantPrototype *variantPrototype;
+ WTF::RefPtr<JSC::Structure> variantWrapperObjectStructure;
+
+ QScriptEngineAgent *agent;
+ QHash<JSC::JSValue, QBasicAtomicInt> keepAliveValues;
+ QHash<int, QScriptTypeInfo*> m_typeInfos;
+ int processEventsInterval;
+
+#ifndef QT_NO_QOBJECT
+ QHash<QObject*, QScript::QObjectData*> m_qobjectData;
+#endif
+
+#ifdef QT_NO_QOBJECT
+ QScriptEngine *q_ptr;
+#endif
+};
+
+namespace QScript
+{
+
+class GlobalObject : public JSC::JSGlobalObject
+{
+public:
+ GlobalObject(QScriptEnginePrivate*);
+ ~GlobalObject();
+ virtual JSC::UString className() const { return "global"; }
+ virtual void mark();
+
+public:
+ QScriptEnginePrivate *engine;
+};
+
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/qscriptengineagent.cpp b/src/script/api/qscriptengineagent.cpp
index bda94ae..1d7cd27 100644
--- a/src/script/qscriptengineagent.cpp
+++ b/src/script/api/qscriptengineagent.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -43,14 +13,6 @@
#ifndef QT_NO_SCRIPT
-#include "qscriptvalue.h"
-#include "qscriptengineagent_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptvalueimpl_p.h"
-
QT_BEGIN_NAMESPACE
/*!
@@ -132,15 +94,27 @@ QT_BEGIN_NAMESPACE
\sa extension()
*/
+class QScriptEngineAgent;
+class Q_SCRIPT_EXPORT QScriptEngineAgentPrivate
+{
+ Q_DECLARE_PUBLIC(QScriptEngineAgent)
+public:
+ QScriptEngineAgentPrivate();
+ virtual ~QScriptEngineAgentPrivate();
+
+ QScriptEngine *engine;
+
+ QScriptEngineAgent *q_ptr;
+};
+
QScriptEngineAgentPrivate::QScriptEngineAgentPrivate()
- : engine(0), q_ptr(0)
{
}
QScriptEngineAgentPrivate::~QScriptEngineAgentPrivate()
{
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- eng_p->agentDeleted(q_ptr);
+// ### QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
+// ### eng_p->agentDeleted(q_ptr);
}
/*!
diff --git a/src/script/qscriptengineagent.h b/src/script/api/qscriptengineagent.h
index 3334bc0..d7493dd 100644
--- a/src/script/qscriptengineagent.h
+++ b/src/script/api/qscriptengineagent.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/api/qscriptengineagent_p.h b/src/script/api/qscriptengineagent_p.h
new file mode 100644
index 0000000..adda00b
--- /dev/null
+++ b/src/script/api/qscriptengineagent_p.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTENGINEAGENT_P_H
+#define QSCRIPTENGINEAGENT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qobjectdefs.h>
+
+#ifndef QT_NO_SCRIPT
+
+QT_BEGIN_NAMESPACE
+
+class QScriptEngine;
+
+class QScriptEngineAgent;
+class Q_SCRIPT_EXPORT QScriptEngineAgentPrivate
+{
+ Q_DECLARE_PUBLIC(QScriptEngineAgent)
+public:
+ QScriptEngineAgentPrivate();
+ virtual ~QScriptEngineAgentPrivate();
+
+ QScriptEngine *engine;
+
+ QScriptEngineAgent *q_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/api/qscriptextensioninterface.h b/src/script/api/qscriptextensioninterface.h
new file mode 100644
index 0000000..1b83c9b
--- /dev/null
+++ b/src/script/api/qscriptextensioninterface.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTEXTENSIONINTERFACE_H
+#define QSCRIPTEXTENSIONINTERFACE_H
+
+#include <QtCore/qfactoryinterface.h>
+
+#ifndef QT_NO_SCRIPT
+
+#include <QtCore/qobject.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Script)
+
+class QScriptEngine;
+
+struct Q_SCRIPT_EXPORT QScriptExtensionInterface
+ : public QFactoryInterface
+{
+ virtual void initialize(const QString &key, QScriptEngine *engine) = 0;
+};
+
+Q_DECLARE_INTERFACE(QScriptExtensionInterface,
+ "com.trolltech.Qt.QScriptExtensionInterface/1.0")
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_SCRIPT
+#endif // QSCRIPTEXTENSIONINTERFACE_H
diff --git a/src/script/qscriptextensionplugin.cpp b/src/script/api/qscriptextensionplugin.cpp
index 1c85606..27e9005 100644
--- a/src/script/qscriptextensionplugin.cpp
+++ b/src/script/api/qscriptextensionplugin.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/api/qscriptextensionplugin.h b/src/script/api/qscriptextensionplugin.h
new file mode 100644
index 0000000..6f6edb2
--- /dev/null
+++ b/src/script/api/qscriptextensionplugin.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTEXTENSIONPLUGIN_H
+#define QSCRIPTEXTENSIONPLUGIN_H
+
+#include <QtCore/qplugin.h>
+
+#ifndef QT_NO_SCRIPT
+
+#include <QtScript/qscriptextensioninterface.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Script)
+
+class QScriptValue;
+
+class Q_SCRIPT_EXPORT QScriptExtensionPlugin : public QObject,
+ public QScriptExtensionInterface
+{
+ Q_OBJECT
+ Q_INTERFACES(QScriptExtensionInterface:QFactoryInterface)
+public:
+ explicit QScriptExtensionPlugin(QObject *parent = 0);
+ ~QScriptExtensionPlugin();
+
+ virtual QStringList keys() const = 0;
+ virtual void initialize(const QString &key, QScriptEngine *engine) = 0;
+
+ QScriptValue setupPackage(const QString &key, QScriptEngine *engine) const;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_SCRIPT
+#endif // QSCRIPTEXTENSIONPLUGIN_H
diff --git a/src/script/qscriptstring.cpp b/src/script/api/qscriptstring.cpp
index 69b0796..89ac4ac 100644
--- a/src/script/qscriptstring.cpp
+++ b/src/script/api/qscriptstring.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -44,13 +14,6 @@
#ifndef QT_NO_SCRIPT
#include "qscriptstring_p.h"
-#include "qscriptnameid_p.h"
-#include "qscriptvalue_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
QT_BEGIN_NAMESPACE
@@ -81,7 +44,6 @@ QT_BEGIN_NAMESPACE
\internal
*/
QScriptStringPrivate::QScriptStringPrivate()
- : nameId(0), engine(0), q_ptr(0)
{
ref = 0;
}
@@ -89,26 +51,18 @@ QScriptStringPrivate::QScriptStringPrivate()
/*!
\internal
*/
-QScriptStringPrivate *QScriptStringPrivate::create()
-{
- return new QScriptStringPrivate();
-}
-
-/*!
- \internal
-*/
-QScriptStringPrivate *QScriptStringPrivate::get(const QScriptString &q)
+QScriptStringPrivate::~QScriptStringPrivate()
{
- return const_cast<QScriptStringPrivate*>(q.d_func());
}
/*!
\internal
*/
-void QScriptStringPrivate::init(QScriptString &q, QScriptStringPrivate *d)
+void QScriptStringPrivate::init(QScriptString &q, const QString &value)
{
- Q_ASSERT(q.d_ptr == 0);
- q.d_ptr = d;
+ Q_ASSERT(!q.isValid());
+ q.d_ptr = new QScriptStringPrivate();
+ q.d_ptr->value = value;
q.d_ptr->ref.ref();
}
@@ -136,12 +90,16 @@ QScriptString::QScriptString(const QScriptString &other)
QScriptString::~QScriptString()
{
if (d_ptr && !d_ptr->ref.deref()) {
+// Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+#if 0
if (isValid()) {
d_ptr->engine->uninternString(d_ptr);
} else {
// the engine has already been deleted
delete d_ptr;
}
+#endif
+ delete d_ptr;
d_ptr = 0;
}
}
@@ -154,12 +112,8 @@ QScriptString &QScriptString::operator=(const QScriptString &other)
if (d_ptr == other.d_ptr)
return *this;
if (d_ptr && !d_ptr->ref.deref()) {
- if (isValid()) {
- d_ptr->engine->uninternString(d_ptr);
- } else {
- // the engine has already been deleted
- delete d_ptr;
- }
+// Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ delete d_ptr;
}
d_ptr = other.d_ptr;
if (d_ptr)
@@ -174,7 +128,7 @@ QScriptString &QScriptString::operator=(const QScriptString &other)
bool QScriptString::isValid() const
{
Q_D(const QScriptString);
- return (d && d->nameId);
+ return (d != 0);
}
/*!
@@ -206,9 +160,9 @@ bool QScriptString::operator!=(const QScriptString &other) const
QString QScriptString::toString() const
{
Q_D(const QScriptString);
- if (!d || !d->nameId)
+ if (!d)
return QString();
- return d->nameId->s;
+ return d->value;
}
/*!
diff --git a/src/script/api/qscriptstring.h b/src/script/api/qscriptstring.h
new file mode 100644
index 0000000..7f854ab
--- /dev/null
+++ b/src/script/api/qscriptstring.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTSTRING_H
+#define QSCRIPTSTRING_H
+
+#include <QtCore/qstring.h>
+
+#ifndef QT_NO_SCRIPT
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Script)
+
+class QScriptEngine;
+class QScriptStringPrivate;
+
+class Q_SCRIPT_EXPORT QScriptString
+{
+public:
+ QScriptString();
+ QScriptString(const QScriptString &other);
+ ~QScriptString();
+
+ QScriptString &operator=(const QScriptString &other);
+
+ bool isValid() const;
+
+ bool operator==(const QScriptString &other) const;
+ bool operator!=(const QScriptString &other) const;
+
+ QString toString() const;
+ operator QString() const;
+
+private:
+ QScriptStringPrivate *d_ptr;
+
+ Q_DECLARE_PRIVATE(QScriptString)
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_SCRIPT
+#endif // QSCRIPTSTRING_H
diff --git a/src/script/api/qscriptstring_p.h b/src/script/api/qscriptstring_p.h
new file mode 100644
index 0000000..0f9ccd1
--- /dev/null
+++ b/src/script/api/qscriptstring_p.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTSTRING_P_H
+#define QSCRIPTSTRING_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qobjectdefs.h>
+
+#ifndef QT_NO_SCRIPT
+
+#include <QtCore/qstring.h>
+
+QT_BEGIN_NAMESPACE
+
+class QScriptString;
+class QScriptStringPrivate
+{
+public:
+ QScriptStringPrivate();
+ ~QScriptStringPrivate();
+
+ static void init(QScriptString &q, const QString &value);
+
+ QBasicAtomicInt ref;
+ QString value;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp
index f72d1db..32c5095 100644
--- a/src/script/qscriptvalue.cpp
+++ b/src/script/api/qscriptvalue.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -44,16 +14,30 @@
#ifndef QT_NO_SCRIPT
#include "qscriptvalue_p.h"
+#include "qscriptengine.h"
#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptclass.h"
-#include "qscriptclass_p.h"
-#include <QtCore/QDateTime>
-#include <QtCore/QRegExp>
+#include "JSArray.h"
+#include "JSGlobalObject.h"
+#include "JSImmediate.h"
+#include "JSObject.h"
+#include "JSValue.h"
+#include "JSFunction.h"
+#include "DateInstance.h"
+#include "ErrorInstance.h"
+#include "RegExpObject.h"
+#include "Identifier.h"
+#include "Operations.h"
+#include "Arguments.h"
+
+#include <QtCore/qdatetime.h>
+#include <QtCore/qregexp.h>
+#include <QtCore/qvariant.h>
+#include <QtCore/qnumeric.h>
+
+#include "utils/qscriptdate_p.h"
+#include "bridge/qscriptvariant_p.h"
+#include "bridge/qscriptqobject_p.h"
QT_BEGIN_NAMESPACE
@@ -181,6 +165,183 @@ QT_BEGIN_NAMESPACE
\value ResolveFull Check the object's own properties first, then search the prototype chain, and finally search the scope chain.
*/
+// ### move
+
+#include <QtCore/qnumeric.h>
+#include <math.h>
+
+namespace QScript
+{
+
+static const qsreal D32 = 4294967296.0;
+
+qint32 ToInt32(qsreal n)
+{
+ if (qIsNaN(n) || qIsInf(n) || (n == 0))
+ return 0;
+
+ double sign = (n < 0) ? -1.0 : 1.0;
+ qsreal abs_n = fabs(n);
+
+ n = ::fmod(sign * ::floor(abs_n), D32);
+ const double D31 = D32 / 2.0;
+
+ if (sign == -1 && n < -D31)
+ n += D32;
+
+ else if (sign != -1 && n >= D31)
+ n -= D32;
+
+ return qint32 (n);
+}
+
+quint32 ToUint32(qsreal n)
+{
+ if (qIsNaN(n) || qIsInf(n) || (n == 0))
+ return 0;
+
+ double sign = (n < 0) ? -1.0 : 1.0;
+ qsreal abs_n = fabs(n);
+
+ n = ::fmod(sign * ::floor(abs_n), D32);
+
+ if (n < 0)
+ n += D32;
+
+ return quint32 (n);
+}
+
+quint16 ToUint16(qsreal n)
+{
+ static const qsreal D16 = 65536.0;
+
+ if (qIsNaN(n) || qIsInf(n) || (n == 0))
+ return 0;
+
+ double sign = (n < 0) ? -1.0 : 1.0;
+ qsreal abs_n = fabs(n);
+
+ n = ::fmod(sign * ::floor(abs_n), D16);
+
+ if (n < 0)
+ n += D16;
+
+ return quint16 (n);
+}
+
+qsreal ToInteger(qsreal n)
+{
+ if (qIsNaN(n))
+ return 0;
+
+ if (n == 0 || qIsInf(n))
+ return n;
+
+ int sign = n < 0 ? -1 : 1;
+ return sign * ::floor(::fabs(n));
+}
+
+} // namespace QScript
+
+QScriptValuePrivate::QScriptValuePrivate()
+{
+ ref = 0;
+}
+
+QScriptValuePrivate::~QScriptValuePrivate()
+{
+}
+
+void QScriptValuePrivate::initFromJSCValue(JSC::JSValue value)
+{
+ type = JSC;
+ jscValue = value;
+ if (!JSC::JSImmediate::isImmediate(value)) {
+ Q_ASSERT(engine != 0);
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
+ if (value != eng_p->globalObject) {
+ if (!eng_p->keepAliveValues.contains(value))
+ eng_p->keepAliveValues[value] = 0;
+ eng_p->keepAliveValues[value].ref();
+ }
+ }
+}
+
+void QScriptValuePrivate::initFromNumber(double value)
+{
+ type = Number;
+ numberValue = value;
+}
+
+void QScriptValuePrivate::initFromString(const QString &value)
+{
+ type = String;
+ stringValue = new QString(value);
+}
+
+void QScriptValuePrivate::initFromJSCValue(QScriptValue &result,
+ QScriptEngine *engine,
+ JSC::JSValue value)
+{
+ Q_ASSERT(!result.isValid());
+ result.d_ptr = new QScriptValuePrivate();
+ result.d_ptr->engine = engine;
+ result.d_ptr->initFromJSCValue(value);
+ result.d_ptr->ref.ref();
+}
+
+bool QScriptValuePrivate::isJSC() const
+{
+ return (type == JSC);
+}
+
+QScriptValuePrivate *QScriptValuePrivate::get(const QScriptValue &q)
+{
+ return q.d_ptr;
+}
+
+namespace QScript
+{
+JSC::UString qtStringToJSCUString(const QString &str);
+QString qtStringFromJSCUString(const JSC::UString &str);
+}
+
+QScriptValue QScriptValuePrivate::property(const QString &name, int resolveMode) const
+{
+ Q_ASSERT(type == JSC);
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::UString jscName = QScript::qtStringToJSCUString(name);
+ JSC::Identifier id = JSC::Identifier(exec, jscName);
+ JSC::JSObject *object = jscValue.getObject();
+ JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object));
+ JSC::JSValue result;
+ if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, id, slot)) {
+ result = slot.getValue(exec, id);
+ } else if ((resolveMode & QScriptValue::ResolvePrototype)
+ && const_cast<JSC::JSObject*>(object)->getPropertySlot(exec, id, slot)) {
+ result = slot.getValue(exec, id);
+ }
+ return eng_p->scriptValueFromJSCValue(result);
+}
+
+QScriptValue QScriptValuePrivate::property(quint32 index, int resolveMode) const
+{
+ Q_ASSERT(type == JSC);
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::JSObject *object = jscValue.getObject();
+ JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object));
+ JSC::JSValue result;
+ if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, index, slot)) {
+ result = slot.getValue(exec, index);
+ } else if ((resolveMode & QScriptValue::ResolvePrototype)
+ && const_cast<JSC::JSObject*>(object)->getPropertySlot(exec, index, slot)) {
+ result = slot.getValue(exec, index);
+ }
+ return eng_p->scriptValueFromJSCValue(result);
+}
+
/*!
Constructs an invalid QScriptValue.
*/
@@ -195,11 +356,13 @@ QScriptValue::QScriptValue()
QScriptValue::~QScriptValue()
{
if (d_ptr && !d_ptr->ref.deref()) {
- if (engine()) {
- QScriptEnginePrivate::get(engine())->unregisterValue(d_ptr);
- } else {
- delete d_ptr;
+ if (d_ptr->engine && d_ptr->isJSC()
+ && !JSC::JSImmediate::isImmediate(d_ptr->jscValue)) {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d_ptr->engine);
+ if (d_ptr->jscValue != eng_p->globalObject)
+ eng_p->releaseJSCValue(d_ptr->jscValue);
}
+ delete d_ptr;
d_ptr = 0;
}
}
@@ -225,14 +388,18 @@ QScriptValue::QScriptValue(const QScriptValue &other)
registers it with the script \a engine.
*/
QScriptValue::QScriptValue(QScriptEngine *engine, QScriptValue::SpecialValue value)
+ : d_ptr(new QScriptValuePrivate)
{
- if (engine) {
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- d_ptr = eng_p->registerValue(QScriptValueImpl(value));
- d_ptr->ref.ref();
- } else {
- d_ptr = 0;
+ d_ptr->engine = engine;
+ switch (value) {
+ case NullValue:
+ d_ptr->initFromJSCValue(JSC::jsNull());
+ break;
+ case UndefinedValue:
+ d_ptr->initFromJSCValue(JSC::jsUndefined());
+ break;
}
+ d_ptr->ref.ref();
}
/*!
@@ -244,14 +411,11 @@ QScriptValue::QScriptValue(QScriptEngine *engine, QScriptValue::SpecialValue val
registers it with the script \a engine.
*/
QScriptValue::QScriptValue(QScriptEngine *engine, bool val)
+ : d_ptr(new QScriptValuePrivate)
{
- if (engine) {
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- d_ptr = eng_p->registerValue(QScriptValueImpl(val));
- d_ptr->ref.ref();
- } else {
- d_ptr = 0;
- }
+ d_ptr->engine = engine;
+ d_ptr->initFromJSCValue(JSC::jsBoolean(val));
+ d_ptr->ref.ref();
}
/*!
@@ -262,14 +426,21 @@ QScriptValue::QScriptValue(QScriptEngine *engine, bool val)
registers it with the script \a engine.
*/
QScriptValue::QScriptValue(QScriptEngine *engine, int val)
+ : d_ptr(new QScriptValuePrivate)
{
+ d_ptr->engine = engine;
if (engine) {
QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- d_ptr = eng_p->registerValue(QScriptValueImpl(val));
- d_ptr->ref.ref();
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ d_ptr->initFromJSCValue(JSC::jsNumber(exec, val));
} else {
- d_ptr = 0;
+ JSC::JSValue immediate = JSC::JSImmediate::from(val);
+ if (immediate)
+ d_ptr->initFromJSCValue(immediate);
+ else
+ d_ptr->initFromNumber(val);
}
+ d_ptr->ref.ref();
}
/*!
@@ -280,14 +451,21 @@ QScriptValue::QScriptValue(QScriptEngine *engine, int val)
registers it with the script \a engine.
*/
QScriptValue::QScriptValue(QScriptEngine *engine, uint val)
+ : d_ptr(new QScriptValuePrivate)
{
+ d_ptr->engine = engine;
if (engine) {
QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- d_ptr = eng_p->registerValue(QScriptValueImpl(val));
- d_ptr->ref.ref();
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ d_ptr->initFromJSCValue(JSC::jsNumber(exec, val));
} else {
- d_ptr = 0;
+ JSC::JSValue immediate = JSC::JSImmediate::from(val);
+ if (immediate)
+ d_ptr->initFromJSCValue(immediate);
+ else
+ d_ptr->initFromNumber(val);
}
+ d_ptr->ref.ref();
}
/*!
@@ -298,14 +476,21 @@ QScriptValue::QScriptValue(QScriptEngine *engine, uint val)
registers it with the script \a engine.
*/
QScriptValue::QScriptValue(QScriptEngine *engine, qsreal val)
+ : d_ptr(new QScriptValuePrivate)
{
+ d_ptr->engine = engine;
if (engine) {
QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- d_ptr = eng_p->registerValue(QScriptValueImpl(val));
- d_ptr->ref.ref();
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ d_ptr->initFromJSCValue(JSC::jsNumber(exec, val));
} else {
- d_ptr = 0;
+ JSC::JSValue immediate = JSC::JSImmediate::from(val);
+ if (immediate)
+ d_ptr->initFromJSCValue(immediate);
+ else
+ d_ptr->initFromNumber(val);
}
+ d_ptr->ref.ref();
}
/*!
@@ -316,16 +501,18 @@ QScriptValue::QScriptValue(QScriptEngine *engine, qsreal val)
registers it with the script \a engine.
*/
QScriptValue::QScriptValue(QScriptEngine *engine, const QString &val)
+ : d_ptr(new QScriptValuePrivate)
{
+ d_ptr->engine = engine;
if (engine) {
- QScriptValueImpl v;
QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- eng_p->newString(&v, val);
- d_ptr = eng_p->registerValue(v);
- d_ptr->ref.ref();
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::UString jscVal = QScript::qtStringToJSCUString(val);
+ d_ptr->initFromJSCValue(JSC::jsString(exec, jscVal));
} else {
- d_ptr = 0;
+ d_ptr->initFromString(val);
}
+ d_ptr->ref.ref();
}
/*!
@@ -338,16 +525,17 @@ QScriptValue::QScriptValue(QScriptEngine *engine, const QString &val)
#ifndef QT_NO_CAST_FROM_ASCII
QScriptValue::QScriptValue(QScriptEngine *engine, const char *val)
+ : d_ptr(new QScriptValuePrivate)
{
+ d_ptr->engine = engine;
if (engine) {
- QScriptValueImpl v;
QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine);
- eng_p->newString(&v, QString::fromAscii(val));
- d_ptr = eng_p->registerValue(v);
- d_ptr->ref.ref();
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ d_ptr->initFromJSCValue(JSC::jsString(exec, val));
} else {
- d_ptr = 0;
+ d_ptr->initFromString(QString::fromAscii(val));
}
+ d_ptr->ref.ref();
}
#endif
@@ -359,7 +547,15 @@ QScriptValue::QScriptValue(QScriptEngine *engine, const char *val)
QScriptValue::QScriptValue(SpecialValue value)
: d_ptr(new QScriptValuePrivate)
{
- d_ptr->value = QScriptValueImpl(value);
+ d_ptr->engine = 0;
+ switch (value) {
+ case NullValue:
+ d_ptr->initFromJSCValue(JSC::jsNull());
+ break;
+ case UndefinedValue:
+ d_ptr->initFromJSCValue(JSC::jsUndefined());
+ break;
+ }
d_ptr->ref.ref();
}
@@ -371,7 +567,8 @@ QScriptValue::QScriptValue(SpecialValue value)
QScriptValue::QScriptValue(bool value)
: d_ptr(new QScriptValuePrivate)
{
- d_ptr->value = QScriptValueImpl(value);
+ d_ptr->engine = 0;
+ d_ptr->initFromJSCValue(JSC::jsBoolean(value));
d_ptr->ref.ref();
}
@@ -383,7 +580,12 @@ QScriptValue::QScriptValue(bool value)
QScriptValue::QScriptValue(int value)
: d_ptr(new QScriptValuePrivate)
{
- d_ptr->value = QScriptValueImpl(value);
+ d_ptr->engine = 0;
+ JSC::JSValue immediate = JSC::JSImmediate::from(value);
+ if (immediate)
+ d_ptr->initFromJSCValue(immediate);
+ else
+ d_ptr->initFromNumber(value);
d_ptr->ref.ref();
}
@@ -395,7 +597,12 @@ QScriptValue::QScriptValue(int value)
QScriptValue::QScriptValue(uint value)
: d_ptr(new QScriptValuePrivate)
{
- d_ptr->value = QScriptValueImpl(value);
+ d_ptr->engine = 0;
+ JSC::JSValue immediate = JSC::JSImmediate::from(value);
+ if (immediate)
+ d_ptr->initFromJSCValue(immediate);
+ else
+ d_ptr->initFromNumber(value);
d_ptr->ref.ref();
}
@@ -407,7 +614,12 @@ QScriptValue::QScriptValue(uint value)
QScriptValue::QScriptValue(qsreal value)
: d_ptr(new QScriptValuePrivate)
{
- d_ptr->value = QScriptValueImpl(value);
+ d_ptr->engine = 0;
+ JSC::JSValue immediate = JSC::JSImmediate::from(value);
+ if (immediate)
+ d_ptr->initFromJSCValue(immediate);
+ else
+ d_ptr->initFromNumber(value);
d_ptr->ref.ref();
}
@@ -419,8 +631,8 @@ QScriptValue::QScriptValue(qsreal value)
QScriptValue::QScriptValue(const QString &value)
: d_ptr(new QScriptValuePrivate)
{
- d_ptr->value.m_type = QScript::LazyStringType;
- d_ptr->value.m_lazy_string_value = new QString(value);
+ d_ptr->engine = 0;
+ d_ptr->initFromString(value);
d_ptr->ref.ref();
}
@@ -432,8 +644,8 @@ QScriptValue::QScriptValue(const QString &value)
QScriptValue::QScriptValue(const QLatin1String &value)
: d_ptr(new QScriptValuePrivate)
{
- d_ptr->value.m_type = QScript::LazyStringType;
- d_ptr->value.m_lazy_string_value = new QString(value);
+ d_ptr->engine = 0;
+ d_ptr->initFromString(value);
d_ptr->ref.ref();
}
@@ -447,8 +659,8 @@ QScriptValue::QScriptValue(const QLatin1String &value)
QScriptValue::QScriptValue(const char *value)
: d_ptr(new QScriptValuePrivate)
{
- d_ptr->value.m_type = QScript::LazyStringType;
- d_ptr->value.m_lazy_string_value = new QString(QString::fromAscii(value));
+ d_ptr->engine = 0;
+ d_ptr->initFromString(QString::fromAscii(value));
d_ptr->ref.ref();
}
#endif
@@ -465,11 +677,12 @@ QScriptValue &QScriptValue::operator=(const QScriptValue &other)
if (d_ptr == other.d_ptr)
return *this;
if (d_ptr && !d_ptr->ref.deref()) {
- if (engine()) {
- QScriptEnginePrivate::get(engine())->unregisterValue(d_ptr);
- } else {
- delete d_ptr;
+ if (d_ptr->engine && d_ptr->isJSC()
+ && !JSC::JSImmediate::isImmediate(d_ptr->jscValue)) {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d_ptr->engine);
+ eng_p->releaseJSCValue(d_ptr->jscValue);
}
+ delete d_ptr;
}
d_ptr = other.d_ptr;
if (d_ptr)
@@ -486,7 +699,9 @@ QScriptValue &QScriptValue::operator=(const QScriptValue &other)
bool QScriptValue::isError() const
{
Q_D(const QScriptValue);
- return d && d->value.isError();
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
+ return false;
+ return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&JSC::ErrorInstance::info);
}
/*!
@@ -498,7 +713,9 @@ bool QScriptValue::isError() const
bool QScriptValue::isArray() const
{
Q_D(const QScriptValue);
- return d && d->value.isArray();
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
+ return false;
+ return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&JSC::JSArray::info);
}
/*!
@@ -510,7 +727,9 @@ bool QScriptValue::isArray() const
bool QScriptValue::isDate() const
{
Q_D(const QScriptValue);
- return d && d->value.isDate();
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
+ return false;
+ return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&JSC::DateInstance::info);
}
/*!
@@ -522,7 +741,9 @@ bool QScriptValue::isDate() const
bool QScriptValue::isRegExp() const
{
Q_D(const QScriptValue);
- return d && d->value.isRegExp();
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
+ return false;
+ return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&JSC::RegExpObject::info);
}
/*!
@@ -535,10 +756,10 @@ bool QScriptValue::isRegExp() const
QScriptValue QScriptValue::prototype() const
{
Q_D(const QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return QScriptValue();
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.prototype());
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ return eng_p->scriptValueFromJSCValue(static_cast<JSC::JSObject*>(d->jscValue.getObject())->prototype());
}
/*!
@@ -555,7 +776,7 @@ QScriptValue QScriptValue::prototype() const
void QScriptValue::setPrototype(const QScriptValue &prototype)
{
Q_D(QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return;
if (prototype.isValid() && prototype.engine()
&& (prototype.engine() != engine())) {
@@ -564,38 +785,31 @@ void QScriptValue::setPrototype(const QScriptValue &prototype)
"a different engine");
return;
}
- QScriptValueImpl was = d->value.prototype();
- d->value.setPrototype(d->value.engine()->toImpl(prototype));
- if (d->value.detectedCycle()) {
- qWarning("QScriptValue::setPrototype() failed: "
- "cyclic prototype value");
- d->value.setPrototype(was);
- }
+ // ### check for cycle
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::JSValue other = eng_p->scriptValueToJSCValue(prototype);
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->setPrototype(other);
}
/*!
- Returns the scope object of this QScriptValue. This function is only
- relevant for function objects. The scope determines how variables are
- resolved when the function is invoked.
+ \internal
*/
QScriptValue QScriptValue::scope() const
{
Q_D(const QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return QScriptValue();
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.scope());
+ // ### make hidden property
+ return d->property(QLatin1String("__qt_scope__"), QScriptValue::ResolveLocal);
}
/*!
- Sets the \a scope object of this QScriptValue. This function is only
- relevant for function objects. Changing the scope is useful when creating
- closures; see \l{Nested Functions and the Scope Chain}.
+ \internal
*/
void QScriptValue::setScope(const QScriptValue &scope)
{
Q_D(QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return;
if (scope.isValid() && scope.engine()
&& (scope.engine() != engine())) {
@@ -604,7 +818,11 @@ void QScriptValue::setScope(const QScriptValue &scope)
"a different engine");
return;
}
- d->value.setScope(d->value.engine()->toImpl(scope));
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::JSValue other = eng_p->scriptValueToJSCValue(scope);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ // ### make hidden property
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->putDirect(JSC::Identifier(exec, "__qt_scope__"), other);
}
/*!
@@ -619,7 +837,7 @@ void QScriptValue::setScope(const QScriptValue &scope)
bool QScriptValue::instanceOf(const QScriptValue &other) const
{
Q_D(const QScriptValue);
- if (!isObject() || !other.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject() || !other.isObject())
return false;
if (other.engine() != engine()) {
qWarning("QScriptValue::instanceof: "
@@ -627,10 +845,168 @@ bool QScriptValue::instanceOf(const QScriptValue &other) const
"a different engine");
return false;
}
- return d->value.engine()->toImpl(*this)
- .instanceOf(d->value.engine()->toImpl(other));
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::JSValue jscProto = eng_p->scriptValueToJSCValue(other.property(QLatin1String("prototype")));
+ if (!jscProto)
+ return false;
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::JSValue jscOther = eng_p->scriptValueToJSCValue(other);
+ return static_cast<JSC::JSObject*>(jscOther.getObject())->hasInstance(exec, d->jscValue, jscProto);
}
+// ### move
+
+namespace QScript
+{
+
+enum Type {
+ Undefined,
+ Null,
+ Boolean,
+ String,
+ Number,
+ Object
+};
+
+static Type type(const QScriptValue &v)
+{
+ if (v.isUndefined())
+ return Undefined;
+ else if (v.isNull())
+ return Null;
+ else if (v.isBoolean())
+ return Boolean;
+ else if (v.isString())
+ return String;
+ else if (v.isNumber())
+ return Number;
+ Q_ASSERT(v.isObject());
+ return Object;
+}
+
+QScriptValue ToPrimitive(const QScriptValue &object, JSC::PreferredPrimitiveType hint = JSC::NoPreference)
+{
+ Q_ASSERT(object.isObject());
+ QScriptValuePrivate *pp = QScriptValuePrivate::get(object);
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(pp->engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ return eng_p->scriptValueFromJSCValue(static_cast<JSC::JSObject*>(pp->jscValue.getObject())->toPrimitive(exec, hint));
+}
+
+static bool IsNumerical(const QScriptValue &value)
+{
+ return value.isNumber() || value.isBool();
+}
+
+static bool LessThan(QScriptValue lhs, QScriptValue rhs)
+{
+ if (type(lhs) == type(rhs)) {
+ switch (type(lhs)) {
+ case Undefined:
+ case Null:
+ return false;
+
+ case Number:
+#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET
+ if (qIsNaN(lhs.toNumber()) || qIsNaN(rhs.toNumber()))
+ return false;
+#endif
+ return lhs.toNumber() < rhs.toNumber();
+
+ case Boolean:
+ return lhs.toBool() < rhs.toBool();
+
+ case String:
+ return lhs.toString() < rhs.toString();
+
+ case Object:
+ break;
+ } // switch
+ }
+
+ if (lhs.isObject())
+ lhs = ToPrimitive(lhs, JSC::PreferNumber);
+
+ if (rhs.isObject())
+ rhs = ToPrimitive(rhs, JSC::PreferNumber);
+
+ if (lhs.isString() && rhs.isString())
+ return lhs.toString() < rhs.toString();
+
+ qsreal n1 = lhs.toNumber();
+ qsreal n2 = rhs.toNumber();
+#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET
+ if (qIsNaN(n1) || qIsNaN(n2))
+ return false;
+#endif
+ return n1 < n2;
+}
+
+static bool Equals(QScriptValue lhs, QScriptValue rhs)
+{
+ if (type(lhs) == type(rhs)) {
+ switch (type(lhs)) {
+ case QScript::Undefined:
+ case QScript::Null:
+ return true;
+
+ case QScript::Number:
+ return lhs.toNumber() == rhs.toNumber();
+
+ case QScript::Boolean:
+ return lhs.toBool() == rhs.toBool();
+
+ case QScript::String:
+ return lhs.toString() == rhs.toString();
+
+ case QScript::Object:
+ if (lhs.isVariant())
+ return lhs.strictlyEquals(rhs) || (lhs.toVariant() == rhs.toVariant());
+#ifndef QT_NO_QOBJECT
+ else if (lhs.isQObject())
+ return (lhs.strictlyEquals(rhs)) || (lhs.toQObject() == rhs.toQObject());
+#endif
+ else
+ return lhs.strictlyEquals(rhs);
+ }
+ }
+
+ if (lhs.isNull() && rhs.isUndefined())
+ return true;
+
+ else if (lhs.isUndefined() && rhs.isNull())
+ return true;
+
+ else if (IsNumerical(lhs) && rhs.isString())
+ return lhs.toNumber() == rhs.toNumber();
+
+ else if (lhs.isString() && IsNumerical(rhs))
+ return lhs.toNumber() == rhs.toNumber();
+
+ else if (lhs.isBool())
+ return Equals(lhs.toNumber(), rhs);
+
+ else if (rhs.isBool())
+ return Equals(lhs, rhs.toNumber());
+
+ else if (lhs.isObject() && !rhs.isNull()) {
+ lhs = ToPrimitive(lhs);
+
+ if (lhs.isValid() && !lhs.isObject())
+ return Equals(lhs, rhs);
+ }
+
+ else if (rhs.isObject() && ! lhs.isNull()) {
+ rhs = ToPrimitive(rhs);
+ if (rhs.isValid() && !rhs.isObject())
+ return Equals(lhs, rhs);
+ }
+
+ return false;
+}
+
+} // namespace QScript
+
/*!
Returns true if this QScriptValue is less than \a other, otherwise
returns false. The comparison follows the behavior described in
@@ -647,6 +1023,7 @@ bool QScriptValue::instanceOf(const QScriptValue &other) const
*/
bool QScriptValue::lessThan(const QScriptValue &other) const
{
+ // no equivalent function in JSC? There's a jsLess() in VM/Machine.cpp
if (!isValid() || !other.isValid())
return false;
if (other.engine() && engine() && (other.engine() != engine())) {
@@ -655,8 +1032,7 @@ bool QScriptValue::lessThan(const QScriptValue &other) const
"a different engine");
return false;
}
- return QScriptEnginePrivate::lessThan(QScriptValuePrivate::valueOf(*this),
- QScriptValuePrivate::valueOf(other));
+ return QScript::LessThan(*this, other);
}
/*!
@@ -685,16 +1061,29 @@ bool QScriptValue::lessThan(const QScriptValue &other) const
*/
bool QScriptValue::equals(const QScriptValue &other) const
{
- if (!isValid() || !other.isValid())
- return isValid() == other.isValid();
+ Q_D(const QScriptValue);
+ if (!d || !other.d_ptr)
+ return (d == other.d_ptr);
if (other.engine() && engine() && (other.engine() != engine())) {
qWarning("QScriptValue::equals: "
"cannot compare to a value created in "
"a different engine");
return false;
}
- return QScriptEnginePrivate::equals(QScriptValuePrivate::valueOf(*this),
- QScriptValuePrivate::valueOf(other));
+ if (d->isJSC() && other.d_ptr->isJSC()) {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ if (!eng_p)
+ eng_p = QScriptEnginePrivate::get(other.d_ptr->engine);
+ if (eng_p) {
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+#if 0
+ if (JSC::equal(exec, d->jscValue, other.d_ptr->jscValue))
+ return true;
+#endif
+ }
+ }
+ return QScript::Equals(*this, other);
}
/*!
@@ -721,16 +1110,26 @@ bool QScriptValue::equals(const QScriptValue &other) const
*/
bool QScriptValue::strictlyEquals(const QScriptValue &other) const
{
- if (!isValid() || !other.isValid())
- return isValid() == other.isValid();
+ Q_D(const QScriptValue);
+ if (!d || !other.d_ptr)
+ return (d == other.d_ptr);
if (other.engine() && engine() && (other.engine() != engine())) {
qWarning("QScriptValue::strictlyEquals: "
"cannot compare to a value created in "
"a different engine");
return false;
}
- return QScriptEnginePrivate::strictlyEquals(QScriptValuePrivate::valueOf(*this),
- QScriptValuePrivate::valueOf(other));
+ if (d->type != other.d_ptr->type)
+ return false;
+ switch (d->type) {
+ case QScriptValuePrivate::JSC:
+ return JSC::JSValue::strictEqual(d->jscValue, other.d_ptr->jscValue);
+ case QScriptValuePrivate::Number:
+ return (d->numberValue == other.d_ptr->numberValue);
+ case QScriptValuePrivate::String:
+ return (*d->stringValue == *other.d_ptr->stringValue);
+ }
+ return false;
}
/*!
@@ -750,7 +1149,19 @@ QString QScriptValue::toString() const
Q_D(const QScriptValue);
if (!d)
return QString();
- return d->value.toString();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0;
+ JSC::UString str = d->jscValue.toString(exec);
+ return QString(reinterpret_cast<const QChar*>(str.data()), str.size());
+ }
+ case QScriptValuePrivate::Number:
+ return QScript::qtStringFromJSCUString(JSC::UString::from(d->numberValue));
+ case QScriptValuePrivate::String:
+ return *d->stringValue;
+ }
+ return QString();
}
/*!
@@ -770,7 +1181,18 @@ qsreal QScriptValue::toNumber() const
Q_D(const QScriptValue);
if (!d)
return 0;
- return d->value.toNumber();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0;
+ return d->jscValue.toNumber(exec);
+ }
+ case QScriptValuePrivate::Number:
+ return d->numberValue;
+ case QScriptValuePrivate::String:
+ return QScript::qtStringToJSCUString(*d->stringValue).toDouble();
+ }
+ return 0;
}
/*!
@@ -783,7 +1205,18 @@ bool QScriptValue::toBoolean() const
Q_D(const QScriptValue);
if (!d)
return false;
- return d->value.toBoolean();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0;
+ return d->jscValue.toBoolean(exec);
+ }
+ case QScriptValuePrivate::Number:
+ return (d->numberValue != 0) && !qIsNaN(d->numberValue);
+ case QScriptValuePrivate::String:
+ return (d->stringValue->length() != 0);
+ }
+ return false;
}
/*!
@@ -805,7 +1238,18 @@ bool QScriptValue::toBool() const
Q_D(const QScriptValue);
if (!d)
return false;
- return d->value.toBoolean();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0;
+ return d->jscValue.toBoolean(exec);
+ }
+ case QScriptValuePrivate::Number:
+ return (d->numberValue != 0) && !qIsNaN(d->numberValue);
+ case QScriptValuePrivate::String:
+ return (d->stringValue->length() != 0);
+ }
+ return false;
}
/*!
@@ -825,7 +1269,18 @@ qint32 QScriptValue::toInt32() const
Q_D(const QScriptValue);
if (!d)
return 0;
- return d->value.toInt32();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0;
+ return d->jscValue.toInt32(exec);
+ }
+ case QScriptValuePrivate::Number:
+ return QScript::ToInt32(d->numberValue);
+ case QScriptValuePrivate::String:
+ return QScript::ToInt32(QScript::qtStringToJSCUString(*d->stringValue).toDouble());
+ }
+ return 0;
}
/*!
@@ -845,7 +1300,18 @@ quint32 QScriptValue::toUInt32() const
Q_D(const QScriptValue);
if (!d)
return 0;
- return d->value.toUInt32();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0;
+ return d->jscValue.toUInt32(exec);
+ }
+ case QScriptValuePrivate::Number:
+ return QScript::ToUint32(d->numberValue);
+ case QScriptValuePrivate::String:
+ return QScript::ToUint32(QScript::qtStringToJSCUString(*d->stringValue).toDouble());
+ }
+ return 0;
}
/*!
@@ -865,7 +1331,17 @@ quint16 QScriptValue::toUInt16() const
Q_D(const QScriptValue);
if (!d)
return 0;
- return d->value.toUInt16();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ // no equivalent function in JSC
+ return QScript::ToUint16(toNumber());
+ }
+ case QScriptValuePrivate::Number:
+ return QScript::ToUint16(d->numberValue);
+ case QScriptValuePrivate::String:
+ return QScript::ToUint16(QScript::qtStringToJSCUString(*d->stringValue).toDouble());
+ }
+ return 0;
}
/*!
@@ -885,7 +1361,18 @@ qsreal QScriptValue::toInteger() const
Q_D(const QScriptValue);
if (!d)
return 0;
- return d->value.toInteger();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0;
+ return d->jscValue.toInteger(exec);
+ }
+ case QScriptValuePrivate::Number:
+ return QScript::ToInteger(d->numberValue);
+ case QScriptValuePrivate::String:
+ return QScript::ToInteger(QScript::qtStringToJSCUString(*d->stringValue).toDouble());
+ }
+ return 0;
}
/*!
@@ -915,7 +1402,43 @@ QVariant QScriptValue::toVariant() const
Q_D(const QScriptValue);
if (!d)
return QVariant();
- return d->value.toVariant();
+ switch (d->type) {
+ case QScriptValuePrivate::JSC:
+ if (isObject()) {
+ if (isVariant())
+ return static_cast<QScript::QVariantWrapperObject*>(d->jscValue.getObject())->value();
+#ifndef QT_NO_QOBJECT
+ else if (isQObject())
+ return qVariantFromValue(toQObject());
+#endif
+ else if (isDate())
+ return QVariant(toDateTime());
+#ifndef QT_NO_REGEXP
+ else if (isRegExp())
+ return QVariant(toRegExp());
+#endif
+ else if (isArray())
+ return QScriptEnginePrivate::variantListFromArray(*this);
+ // try to convert to primitive
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine());
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::JSValue prim = d->jscValue.toPrimitive(exec);
+ if (!prim.isObject())
+ return eng_p->scriptValueFromJSCValue(prim).toVariant();
+ } else if (isNumber()) {
+ return QVariant(toNumber());
+ } else if (isString()) {
+ return QVariant(toString());
+ } else if (isBool()) {
+ return QVariant(toBool());
+ }
+ return QVariant();
+ case QScriptValuePrivate::Number:
+ return QVariant(d->numberValue);
+ case QScriptValuePrivate::String:
+ return QVariant(*d->stringValue);
+ }
+ return QVariant();
}
/*!
@@ -926,12 +1449,22 @@ QVariant QScriptValue::toVariant() const
QScriptValue QScriptValue::toObject() const
{
Q_D(const QScriptValue);
- if (!d)
+ if (!d || !d->engine)
return QScriptValue();
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- if (!eng)
- return QScriptValue();
- return eng->toPublic(eng->toObject(d->value));
+ switch (d->type) {
+ case QScriptValuePrivate::JSC: {
+ if (JSC::JSImmediate::isUndefinedOrNull(d->jscValue))
+ return QScriptValue();
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ return eng_p->scriptValueFromJSCValue(d->jscValue.toObject(exec));
+ }
+ case QScriptValuePrivate::Number:
+ case QScriptValuePrivate::String:
+ Q_ASSERT_X(false, Q_FUNC_INFO, "you should not get here");
+ break;
+ }
+ return QScriptValue();
}
/*!
@@ -944,9 +1477,10 @@ QScriptValue QScriptValue::toObject() const
QDateTime QScriptValue::toDateTime() const
{
Q_D(const QScriptValue);
- if (!d)
+ if (!isDate())
return QDateTime();
- return d->value.toDateTime();
+ qsreal t = static_cast<JSC::DateInstance*>(d->jscValue.getObject())->internalNumber();
+ return QScript::ToDateTime(t, Qt::LocalTime);
}
#ifndef QT_NO_REGEXP
@@ -960,9 +1494,13 @@ QDateTime QScriptValue::toDateTime() const
QRegExp QScriptValue::toRegExp() const
{
Q_D(const QScriptValue);
- if (!d)
+ if (!isRegExp())
return QRegExp();
- return d->value.toRegExp();
+ QString pattern = d->property(QLatin1String("source"), QScriptValue::ResolvePrototype).toString();
+ Qt::CaseSensitivity kase = Qt::CaseSensitive;
+ if (d->property(QLatin1String("ignoreCase"), QScriptValue::ResolvePrototype).toBool())
+ kase = Qt::CaseInsensitive;
+ return QRegExp(pattern, kase, QRegExp::RegExp2);
}
#endif // QT_NO_REGEXP
@@ -979,9 +1517,15 @@ QRegExp QScriptValue::toRegExp() const
QObject *QScriptValue::toQObject() const
{
Q_D(const QScriptValue);
- if (!d)
- return 0;
- return d->value.toQObject();
+ if (isQObject()) {
+ return static_cast<QScript::QObjectWrapperObject*>(d->jscValue.getObject())->value();
+ } else if (isVariant()) {
+ QVariant var = toVariant();
+ int type = var.userType();
+ if ((type == QMetaType::QObjectStar) || (type == QMetaType::QWidgetStar))
+ return *reinterpret_cast<QObject* const *>(var.constData());
+ }
+ return 0;
}
/*!
@@ -992,10 +1536,11 @@ QObject *QScriptValue::toQObject() const
*/
const QMetaObject *QScriptValue::toQMetaObject() const
{
- Q_D(const QScriptValue);
- if (!d)
- return 0;
- return d->value.toQMetaObject();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// Q_D(const QScriptValue);
+// if (isQMetaObject())
+// return static_cast<QScript::QMetaObjectWrapperObject*>(d->jscValue)->value();
+ return 0;
}
/*!
@@ -1026,7 +1571,7 @@ void QScriptValue::setProperty(const QString &name, const QScriptValue &value,
const PropertyFlags &flags)
{
Q_D(QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return;
if (value.engine() && (value.engine() != engine())) {
qWarning("QScriptValue::setProperty(%s) failed: "
@@ -1034,7 +1579,40 @@ void QScriptValue::setProperty(const QString &name, const QScriptValue &value,
qPrintable(name));
return;
}
- d->value.setProperty(name, d->value.engine()->toImpl(value), flags);
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::JSValue jscValue = eng_p->scriptValueToJSCValue(value);
+ JSC::UString jscName = QScript::qtStringToJSCUString(name);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::Identifier id = JSC::Identifier(exec, jscName);
+ if (!jscValue) {
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->deleteProperty(exec, id);
+ } else {
+ if ((flags & QScriptValue::PropertyGetter) || (flags & QScriptValue::PropertySetter)) {
+ if (jscValue.isObject()) {
+ if (flags & QScriptValue::PropertyGetter)
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->defineGetter(exec, id, static_cast<JSC::JSObject*>(jscValue.getObject()));
+ if (flags & QScriptValue::PropertySetter)
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->defineSetter(exec, id, static_cast<JSC::JSObject*>(jscValue.getObject()));
+ }
+ } else {
+ if (flags != QScriptValue::KeepExistingFlags) {
+ if (static_cast<JSC::JSObject*>(d->jscValue.getObject())->hasOwnProperty(exec, id))
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->deleteProperty(exec, id);
+ unsigned attribs = 0;
+ if (flags & QScriptValue::ReadOnly)
+ attribs |= JSC::ReadOnly;
+ if (flags & QScriptValue::SkipInEnumeration)
+ attribs |= JSC::DontEnum;
+ if (flags & QScriptValue::Undeletable)
+ attribs |= JSC::DontDelete;
+ attribs |= flags & QScriptValue::UserRange;
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->putWithAttributes(exec, id, jscValue, attribs);
+ } else {
+ JSC::PutPropertySlot slot;
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->put(exec, id, jscValue, slot);
+ }
+ }
+ }
}
/*!
@@ -1056,10 +1634,9 @@ QScriptValue QScriptValue::property(const QString &name,
const ResolveFlags &mode) const
{
Q_D(const QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return QScriptValue();
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.property(name, mode));
+ return d->property(name, mode);
}
/*!
@@ -1079,10 +1656,9 @@ QScriptValue QScriptValue::property(quint32 arrayIndex,
const ResolveFlags &mode) const
{
Q_D(const QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return QScriptValue();
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.property(arrayIndex, mode));
+ return d->property(arrayIndex, mode);
}
/*!
@@ -1100,15 +1676,40 @@ QScriptValue QScriptValue::property(quint32 arrayIndex,
void QScriptValue::setProperty(quint32 arrayIndex, const QScriptValue &value,
const PropertyFlags &flags)
{
- Q_D(QScriptValue);
- if (!d || !d->value.isObject())
+ Q_D(const QScriptValue);
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return;
if (value.engine() && (value.engine() != engine())) {
qWarning("QScriptValue::setProperty() failed: "
"cannot set value created in a different engine");
return;
}
- d->value.setProperty(arrayIndex, d->value.engine()->toImpl(value), flags);
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::JSValue jscValue = eng_p->scriptValueToJSCValue(value);
+ if (!jscValue) {
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->deleteProperty(exec, arrayIndex);
+ } else {
+ if ((flags & QScriptValue::PropertyGetter) || (flags & QScriptValue::PropertySetter)) {
+ Q_ASSERT_X(false, Q_FUNC_INFO, "property getters and setters not implemented");
+ } else {
+ if (flags != QScriptValue::KeepExistingFlags) {
+// if (static_cast<JSC::JSObject*>(d->jscValue->getObject())->hasOwnProperty(exec, arrayIndex))
+// static_cast<JSC::JSObject*>(d->jscValue->getObject())->deleteProperty(exec, arrayIndex);
+ unsigned attribs = 0;
+ if (flags & QScriptValue::ReadOnly)
+ attribs |= JSC::ReadOnly;
+ if (flags & QScriptValue::SkipInEnumeration)
+ attribs |= JSC::DontEnum;
+ if (flags & QScriptValue::Undeletable)
+ attribs |= JSC::DontDelete;
+ attribs |= flags & QScriptValue::UserRange;
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->putWithAttributes(exec, arrayIndex, jscValue, attribs);
+ } else {
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->put(exec, arrayIndex, jscValue);
+ }
+ }
+ }
}
/*!
@@ -1126,14 +1727,8 @@ void QScriptValue::setProperty(quint32 arrayIndex, const QScriptValue &value,
QScriptValue QScriptValue::property(const QScriptString &name,
const ResolveFlags &mode) const
{
- Q_D(const QScriptValue);
- if (!d || !d->value.isObject())
- return QScriptValue();
- if (!name.isValid())
- return QScriptValue();
- QScriptStringPrivate *s = QScriptStringPrivate::get(name);
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.property(s->nameId, mode));
+ // ### simplified for now
+ return property(name.toString(), mode);
}
/*!
@@ -1153,16 +1748,8 @@ void QScriptValue::setProperty(const QScriptString &name,
const QScriptValue &value,
const PropertyFlags &flags)
{
- Q_D(QScriptValue);
- if (!d || !d->value.isObject() || !name.isValid())
- return;
- if (value.engine() && (value.engine() != engine())) {
- qWarning("QScriptValue::setProperty() failed: "
- "cannot set value created in a different engine");
- return;
- }
- QScriptStringPrivate *s = QScriptStringPrivate::get(name);
- d->value.setProperty(s->nameId, d->value.engine()->toImpl(value), flags);
+ // ### simplified for now
+ setProperty(name.toString(), value, flags);
}
/*!
@@ -1175,9 +1762,35 @@ QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QString &name,
const ResolveFlags &mode) const
{
Q_D(const QScriptValue);
- if (!d)
+ if (!isObject())
+ return 0;
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::UString jscName = QScript::qtStringToJSCUString(name);
+ JSC::Identifier id = JSC::Identifier(exec, jscName);
+ unsigned attribs = 0;
+ if (!static_cast<JSC::JSObject*>(d->jscValue.getObject())->getPropertyAttributes(exec, id, attribs))
return 0;
- return d->value.propertyFlags(name, mode);
+ QScriptValue::PropertyFlags result = 0;
+ if (attribs & JSC::ReadOnly)
+ result |= QScriptValue::ReadOnly;
+ if (attribs & JSC::DontEnum)
+ result |= QScriptValue::SkipInEnumeration;
+ if (attribs & JSC::DontDelete)
+ result |= QScriptValue::Undeletable;
+
+// ### FIXME
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+#if 0
+ // ### faster/better way?
+ if (static_cast<JSC::JSObject*>(d->jscValue.getObject())->lookupGetter(exec, id) != 0)
+ result |= QScriptValue::PropertyGetter;
+ if (static_cast<JSC::JSObject*>(d->jscValue.getObject())->lookupSetter(exec, id) != 0)
+ result |= QScriptValue::PropertySetter;
+#endif
+
+ result |= QScriptValue::PropertyFlag(attribs & QScriptValue::UserRange);
+ return result;
}
/*!
@@ -1191,13 +1804,8 @@ QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QString &name,
QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QScriptString &name,
const ResolveFlags &mode) const
{
- Q_D(const QScriptValue);
- if (!d)
- return 0;
- if (!name.isValid())
- return 0;
- QScriptStringPrivate *s = QScriptStringPrivate::get(name);
- return d->value.propertyFlags(s->nameId, mode);
+ // ### simplified for now
+ return propertyFlags(name.toString(), mode);
}
/*!
@@ -1226,19 +1834,28 @@ QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QScriptString &nam
QScriptValue QScriptValue::call(const QScriptValue &thisObject,
const QScriptValueList &args)
{
- Q_D(QScriptValue);
- if (!d || !d->value.isObject())
- return QScriptValue();
- if (isFunction() && thisObject.isValid() && thisObject.engine() &&
- engine() && (thisObject.engine() != engine())) {
- qWarning("QScriptValue::call() failed: "
- "cannot call function with thisObject created in "
- "a different engine");
+ Q_D(const QScriptValue);
+ if (!isFunction())
return QScriptValue();
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::ArgList jscArgs;
+ for (int i = 0; i < args.size(); ++i) {
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+#if 0
+ if (!args.at(i).isValid())
+ jscArgs.append(JSC::jsUndefined());
+ else
+ jscArgs.append(eng_p->scriptValueToJSCValue(args.at(i)));
+#endif
}
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.call(eng->toImpl(thisObject),
- eng->toImplList(args)));
+ JSC::JSValue jscThisObject = eng_p->scriptValueToJSCValue(thisObject);
+ if (!jscThisObject || !jscThisObject.isObject())
+ jscThisObject = eng_p->globalObject;
+ JSC::JSValue result = static_cast<JSC::JSFunction*>(JSC::asFunction(d->jscValue))->call(exec, jscThisObject, jscArgs);
+ if (exec->hadException())
+ result = exec->exception();
+ return eng_p->scriptValueFromJSCValue(result);
}
/*!
@@ -1268,18 +1885,41 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject,
const QScriptValue &arguments)
{
Q_D(QScriptValue);
- if (!d || !d->value.isObject())
- return QScriptValue();
- if (isFunction() && thisObject.isValid() && thisObject.engine()
- && (thisObject.engine() != engine())) {
- qWarning("QScriptValue::call() failed: "
- "cannot call function with thisObject created in "
- "a different engine");
+ if (!isFunction())
return QScriptValue();
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+
+ JSC::JSValue jscThisObject = eng_p->scriptValueToJSCValue(thisObject);
+ if (!jscThisObject || !jscThisObject.isObject())
+ jscThisObject = eng_p->globalObject;
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+#if 0
+ // copied from kjs/FunctionPrototype.cpp, functionProtoFuncApply()
+ JSC::JSValue argArray = eng_p->scriptValueToJSCValue(arguments);
+ JSC::ArgList applyArgs;
+ if (!argArray.isUndefinedOrNull()) {
+ if (argArray.isObject()) {
+ if (static_cast<JSC::JSObject*>(argArray.getObject())->classInfo() == &JSC::Arguments::info)
+ static_cast<JSC::Arguments*>(asArguments(argArray))->fillArgList(exec, applyArgs);
+ else if (exec->interpreter()->isJSArray(argArray))
+ static_cast<JSC::JSArray*>(JSC::asArray(argArray))->fillArgList(exec, applyArgs);
+ else if (static_cast<JSC::JSObject*>(argArray.getObject())->inherits(&JSC::JSArray::info)) {
+ unsigned length = static_cast<JSC::JSObject*>(argArray.getObject())->get(exec, exec->propertyNames().length)->toUInt32(exec);
+ for (unsigned i = 0; i < length; ++i)
+ applyArgs.append(static_cast<JSC::JSObject*>(argArray.getObject())->get(exec, i));
+ } else
+ return QScriptValue(); // ### throwError(exec, TypeError);
+ } else
+ return QScriptValue(); // ### throwError(exec, TypeError);
}
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.call(eng->toImpl(thisObject),
- eng->toImpl(arguments)));
+
+ JSC::JSValue result = static_cast<JSC::JSFunction*>(asFunction(d->jscValue))->call(exec, jscThisObject, applyArgs);
+ if (exec->hadException())
+ result = exec->exception();
+ return eng_p->scriptValueFromJSCValue(result);
+#endif
}
/*!
@@ -1302,11 +1942,25 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject,
*/
QScriptValue QScriptValue::construct(const QScriptValueList &args)
{
- Q_D(QScriptValue);
- if (!d || !d->value.isObject())
+ Q_D(const QScriptValue);
+ if (!isFunction())
return QScriptValue();
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.construct(eng->toImplList(args)));
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::ArgList jscArgs;
+ for (int i = 0; i < args.size(); ++i) {
+#if 0
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+ if (!args.at(i).isValid())
+ jscArgs.append(JSC::jsUndefined());
+ else
+ jscArgs.append(eng_p->scriptValueToJSCValue(args.at(i)));
+#endif
+ }
+ JSC::JSValue result = static_cast<JSC::JSFunction*>(asFunction(d->jscValue))->construct(exec, jscArgs);
+ if (exec->hadException())
+ result = exec->exception();
+ return eng_p->scriptValueFromJSCValue(result);
}
/*!
@@ -1327,10 +1981,37 @@ QScriptValue QScriptValue::construct(const QScriptValueList &args)
QScriptValue QScriptValue::construct(const QScriptValue &arguments)
{
Q_D(QScriptValue);
- if (!d || !d->value.isObject())
+ if (!isFunction())
return QScriptValue();
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.construct(eng->toImpl(arguments)));
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+#if 0
+ // copied from kjs/FunctionPrototype.cpp, functionProtoFuncApply()
+ JSC::JSValue argArray = eng_p->scriptValueToJSCValue(arguments);
+ JSC::ArgList applyArgs;
+ if (!argArray.isUndefinedOrNull()) {
+ if (argArray.isObject()) {
+ if (static_cast<JSC::JSObject*>(argArray.getObject())->classInfo() == &JSC::Arguments::info)
+ static_cast<JSC::Arguments*>(JSC::asArguments(argArray))->fillArgList(exec, applyArgs);
+ else if (exec->interpreter()->isJSArray(argArray))
+ static_cast<JSC::JSArray*>(JSC::asArray(argArray))->fillArgList(exec, applyArgs);
+ else if (static_cast<JSC::JSObject*>(argArray.getObject())->inherits(&JSC::JSArray::info)) {
+ unsigned length = static_cast<JSC::JSObject*>(argArray.getObject())->get(exec, exec->propertyNames().length)->toUInt32(exec);
+ for (unsigned i = 0; i < length; ++i)
+ applyArgs.append(static_cast<JSC::JSObject*>(argArray.getObject())->get(exec, i));
+ } else
+ return QScriptValue(); // ### throwError(exec, TypeError);
+ } else
+ return QScriptValue(); // ### throwError(exec, TypeError);
+ }
+
+ JSC::JSValue result = static_cast<JSC::JSFunction*>(JSC::asFunction(d->jscValue))->construct(exec, applyArgs);
+ if (exec->hadException())
+ result = exec->exception();
+ return eng_p->scriptValueFromJSCValue(result);
+#endif
}
/*!
@@ -1354,7 +2035,7 @@ QScriptEngine *QScriptValue::engine() const
bool QScriptValue::isBoolean() const
{
Q_D(const QScriptValue);
- return d && d->value.isBoolean();
+ return d && d->isJSC() && d->jscValue.isBoolean();
}
/*!
@@ -1368,7 +2049,7 @@ bool QScriptValue::isBoolean() const
bool QScriptValue::isBool() const
{
Q_D(const QScriptValue);
- return d && d->value.isBoolean();
+ return d && d->isJSC() && d->jscValue.isBoolean();
}
/*!
@@ -1380,7 +2061,17 @@ bool QScriptValue::isBool() const
bool QScriptValue::isNumber() const
{
Q_D(const QScriptValue);
- return d && d->value.isNumber();
+ if (!d)
+ return false;
+ switch (d->type) {
+ case QScriptValuePrivate::JSC:
+ return d->jscValue.isNumber();
+ case QScriptValuePrivate::Number:
+ return true;
+ case QScriptValuePrivate::String:
+ return false;
+ }
+ return false;
}
/*!
@@ -1392,7 +2083,17 @@ bool QScriptValue::isNumber() const
bool QScriptValue::isString() const
{
Q_D(const QScriptValue);
- return d && d->value.isString();
+ if (!d)
+ return false;
+ switch (d->type) {
+ case QScriptValuePrivate::JSC:
+ return d->jscValue.isString();
+ case QScriptValuePrivate::Number:
+ return false;
+ case QScriptValuePrivate::String:
+ return true;
+ }
+ return false;
}
/*!
@@ -1404,7 +2105,10 @@ bool QScriptValue::isString() const
bool QScriptValue::isFunction() const
{
Q_D(const QScriptValue);
- return d && d->value.isFunction();
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
+ return false;
+ JSC::CallData callData;
+ return (static_cast<JSC::JSObject*>(d->jscValue.getObject())->getCallData(callData) != JSC::CallTypeNone);
}
/*!
@@ -1416,7 +2120,7 @@ bool QScriptValue::isFunction() const
bool QScriptValue::isNull() const
{
Q_D(const QScriptValue);
- return d && d->value.isNull();
+ return d && d->isJSC() && d->jscValue.isNull();
}
/*!
@@ -1428,7 +2132,7 @@ bool QScriptValue::isNull() const
bool QScriptValue::isUndefined() const
{
Q_D(const QScriptValue);
- return d && d->value.isUndefined();
+ return d && d->isJSC() && d->jscValue.isUndefined();
}
/*!
@@ -1443,7 +2147,7 @@ bool QScriptValue::isUndefined() const
bool QScriptValue::isObject() const
{
Q_D(const QScriptValue);
- return d && d->value.isObject();
+ return d && d->isJSC() && d->jscValue.isObject();
}
/*!
@@ -1455,7 +2159,9 @@ bool QScriptValue::isObject() const
bool QScriptValue::isVariant() const
{
Q_D(const QScriptValue);
- return d && d->value.isVariant();
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
+ return false;
+ return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&QScript::QVariantWrapperObject::info);
}
/*!
@@ -1470,7 +2176,9 @@ bool QScriptValue::isVariant() const
bool QScriptValue::isQObject() const
{
Q_D(const QScriptValue);
- return d && d->value.isQObject();
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
+ return false;
+ return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&QScript::QObjectWrapperObject::info);
}
/*!
@@ -1482,7 +2190,11 @@ bool QScriptValue::isQObject() const
bool QScriptValue::isQMetaObject() const
{
Q_D(const QScriptValue);
- return d && d->value.isQMetaObject();
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
+ return false;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// return static_cast<JSC::JSObject*>(d->jscValue->getObject())->isObject(&QScript::QMetaObjectWrapperObject::info);
+ return false;
}
/*!
@@ -1492,7 +2204,7 @@ bool QScriptValue::isQMetaObject() const
bool QScriptValue::isValid() const
{
Q_D(const QScriptValue);
- return d && d->value.isValid();
+ return (d != 0);
}
/*!
@@ -1506,10 +2218,10 @@ bool QScriptValue::isValid() const
QScriptValue QScriptValue::data() const
{
Q_D(const QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return QScriptValue();
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- return eng->toPublic(d->value.internalValue());
+ // ### make hidden property
+ return d->property(QLatin1String("__qt_data__"), QScriptValue::ResolveLocal);
}
/*!
@@ -1523,10 +2235,13 @@ QScriptValue QScriptValue::data() const
void QScriptValue::setData(const QScriptValue &data)
{
Q_D(QScriptValue);
- if (!d || !d->value.isObject())
+ if (!d || !d->isJSC() || !d->jscValue.isObject())
return;
- QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine());
- d->value.setInternalValue(eng->toImpl(data));
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
+ JSC::JSValue other = eng_p->scriptValueToJSCValue(data);
+ JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ // ### make hidden property
+ static_cast<JSC::JSObject*>(d->jscValue.getObject())->putDirect(JSC::Identifier(exec, "__qt_data__"), other);
}
/*!
@@ -1539,13 +2254,11 @@ void QScriptValue::setData(const QScriptValue &data)
*/
QScriptClass *QScriptValue::scriptClass() const
{
- Q_D(const QScriptValue);
- if (!d || !d->value.isObject())
+ if (isObject())
return 0;
- QScriptClassInfo *info = d->value.classInfo();
- if ((info->type() & QScriptClassInfo::TypeMask) < QScriptClassInfo::CustomType)
- return 0;
- return QScriptClassPrivate::classFromInfo(info);
+ // ### implement me
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return 0;
}
/*!
@@ -1563,16 +2276,9 @@ QScriptClass *QScriptValue::scriptClass() const
*/
void QScriptValue::setScriptClass(QScriptClass *scriptClass)
{
- Q_D(QScriptValue);
- if (!d || !d->value.isObject())
- return;
- if (!scriptClass) {
- QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine());
- d->value.setClassInfo(eng_p->m_class_object);
- } else {
- QScriptClassPrivate *cls_p = QScriptClassPrivate::get(scriptClass);
- d->value.setClassInfo(cls_p->classInfo());
- }
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // no idea... use a "hidden" property?
+ Q_UNUSED(scriptClass);
}
/*!
@@ -1585,10 +2291,11 @@ void QScriptValue::setScriptClass(QScriptClass *scriptClass)
*/
qint64 QScriptValue::objectId() const
{
- Q_D(const QScriptValue);
- if (!d || !d->value.isObject())
+ if (!isObject())
return -1;
- return d->value.m_object_value->m_id;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ // lazily initialized mapping from JSObject* to id?
+ return -1;
}
QT_END_NAMESPACE
diff --git a/src/script/qscriptvalue.h b/src/script/api/qscriptvalue.h
index 306da53..3fa165f 100644
--- a/src/script/qscriptvalue.h
+++ b/src/script/api/qscriptvalue.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -215,12 +185,6 @@ public:
qint64 objectId() const;
private:
- // force compile error, prevent QScriptValue(bool) to be called
- inline QScriptValue(void *) { Q_ASSERT(false); }
- // force compile error, prevent QScriptValue(QScriptEngine*, bool) to be called
- inline QScriptValue(QScriptEngine *, void *) { Q_ASSERT(false); }
-
-private:
QScriptValuePrivate *d_ptr;
Q_DECLARE_PRIVATE(QScriptValue)
diff --git a/src/script/api/qscriptvalue_p.h b/src/script/api/qscriptvalue_p.h
new file mode 100644
index 0000000..31230a6
--- /dev/null
+++ b/src/script/api/qscriptvalue_p.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTVALUE_P_H
+#define QSCRIPTVALUE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qobjectdefs.h>
+
+#ifndef QT_NO_SCRIPT
+
+QT_BEGIN_NAMESPACE
+
+#include "wtf/Platform.h"
+#include "JSValue.h"
+
+class QString;
+class QScriptEngine;
+class QScriptValue;
+class QScriptValuePrivate
+{
+public:
+ enum Type {
+ JSC,
+ Number,
+ String
+ };
+
+ QScriptValuePrivate();
+ ~QScriptValuePrivate();
+
+ void initFromJSCValue(JSC::JSValue value);
+ void initFromNumber(double value);
+ void initFromString(const QString &value);
+
+ static void initFromJSCValue(QScriptValue &result,
+ QScriptEngine *engine,
+ JSC::JSValue value);
+
+ bool isJSC() const;
+
+ static QScriptValuePrivate *get(const QScriptValue &q);
+
+ QScriptValue property(const QString &name, int resolveMode) const;
+ QScriptValue property(quint32 index, int resolveMode) const;
+
+ QScriptEngine *engine;
+ Type type;
+ JSC::JSValue jscValue;
+ double numberValue;
+ QString *stringValue;
+
+ QBasicAtomicInt ref;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/qscriptvalueiterator.cpp b/src/script/api/qscriptvalueiterator.cpp
index 1a60632..f9286c8 100644
--- a/src/script/qscriptvalueiterator.cpp
+++ b/src/script/api/qscriptvalueiterator.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -43,13 +13,7 @@
#ifndef QT_NO_SCRIPT
-#include "qscriptvalueiterator_p.h"
-#include "qscriptvalueiteratorimpl_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
+#include "qscriptstring.h"
QT_BEGIN_NAMESPACE
@@ -93,21 +57,11 @@ QT_BEGIN_NAMESPACE
\sa QScriptValue::property()
*/
-/*!
- \internal
-*/
-QScriptValueIteratorPrivate::QScriptValueIteratorPrivate()
- : q_ptr(0), it(0)
-{
-}
-
-/*!
- \internal
-*/
-QScriptValueIteratorPrivate::~QScriptValueIteratorPrivate()
+class QScriptValueIteratorPrivate
{
- delete it;
-}
+public:
+ QScriptValue object;
+};
/*!
Constructs an iterator for traversing \a object. The iterator is
@@ -116,12 +70,9 @@ QScriptValueIteratorPrivate::~QScriptValueIteratorPrivate()
*/
QScriptValueIterator::QScriptValueIterator(const QScriptValue &object)
{
- QScriptValueImpl val = QScriptValuePrivate::valueOf(object);
- if (!val.isObject()) {
+ if (!object.isObject()) {
d_ptr = 0;
} else {
- d_ptr = new QScriptValueIteratorPrivate();
- d_ptr->it = new QScriptValueIteratorImpl(val);
}
}
@@ -145,8 +96,8 @@ QScriptValueIterator::~QScriptValueIterator()
*/
bool QScriptValueIterator::hasNext() const
{
- Q_D(const QScriptValueIterator);
- return (d && d->it->hasNext());
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return false;
}
/*!
@@ -159,9 +110,7 @@ bool QScriptValueIterator::hasNext() const
*/
void QScriptValueIterator::next()
{
- Q_D(QScriptValueIterator);
- if (d)
- d->it->next();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
@@ -173,8 +122,8 @@ void QScriptValueIterator::next()
*/
bool QScriptValueIterator::hasPrevious() const
{
- Q_D(const QScriptValueIterator);
- return (d && d->it->hasPrevious());
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return false;
}
/*!
@@ -187,9 +136,7 @@ bool QScriptValueIterator::hasPrevious() const
*/
void QScriptValueIterator::previous()
{
- Q_D(QScriptValueIterator);
- if (d)
- d->it->previous();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
@@ -200,9 +147,7 @@ void QScriptValueIterator::previous()
*/
void QScriptValueIterator::toFront()
{
- Q_D(QScriptValueIterator);
- if (d)
- d->it->toFront();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
@@ -213,9 +158,7 @@ void QScriptValueIterator::toFront()
*/
void QScriptValueIterator::toBack()
{
- Q_D(QScriptValueIterator);
- if (d)
- d->it->toBack();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
@@ -226,10 +169,8 @@ void QScriptValueIterator::toBack()
*/
QString QScriptValueIterator::name() const
{
- Q_D(const QScriptValueIterator);
- if (!d)
- return QString();
- return d->it->name();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QString();
}
/*!
@@ -240,11 +181,8 @@ QString QScriptValueIterator::name() const
*/
QScriptString QScriptValueIterator::scriptName() const
{
- Q_D(const QScriptValueIterator);
- if (!d)
- return QScriptString();
- QScriptEnginePrivate *eng = d->it->object().engine();
- return eng->internedString(d->it->nameId());
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QScriptString();
}
/*!
@@ -255,11 +193,8 @@ QScriptString QScriptValueIterator::scriptName() const
*/
QScriptValue QScriptValueIterator::value() const
{
- Q_D(const QScriptValueIterator);
- if (!d)
- return QScriptValue();
- QScriptEnginePrivate *eng = d->it->object().engine();
- return eng->toPublic(d->it->value());
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return QScriptValue();
}
/*!
@@ -270,11 +205,8 @@ QScriptValue QScriptValueIterator::value() const
*/
void QScriptValueIterator::setValue(const QScriptValue &value)
{
- Q_D(const QScriptValueIterator);
- if (d) {
- QScriptEnginePrivate *eng = d->it->object().engine();
- d->it->setValue(eng->toImpl(value));
- }
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(value);
}
/*!
@@ -285,10 +217,8 @@ void QScriptValueIterator::setValue(const QScriptValue &value)
*/
QScriptValue::PropertyFlags QScriptValueIterator::flags() const
{
- Q_D(const QScriptValueIterator);
- if (!d)
- return 0;
- return QScriptValue::PropertyFlags(d->it->flags() & ~QScript::Member::InternalRange);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ return 0;
}
/*!
@@ -299,9 +229,7 @@ QScriptValue::PropertyFlags QScriptValueIterator::flags() const
*/
void QScriptValueIterator::remove()
{
- Q_D(const QScriptValueIterator);
- if (d)
- d->it->remove();
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
}
/*!
@@ -311,15 +239,8 @@ void QScriptValueIterator::remove()
*/
QScriptValueIterator& QScriptValueIterator::operator=(QScriptValue &object)
{
- if (d_ptr) {
- delete d_ptr;
- d_ptr = 0;
- }
- QScriptValueImpl val = QScriptValuePrivate::valueOf(object);
- if (val.isObject()) {
- d_ptr = new QScriptValueIteratorPrivate();
- d_ptr->it = new QScriptValueIteratorImpl(val);
- }
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ Q_UNUSED(object);
return *this;
}
diff --git a/src/script/api/qscriptvalueiterator.h b/src/script/api/qscriptvalueiterator.h
new file mode 100644
index 0000000..34a4a12
--- /dev/null
+++ b/src/script/api/qscriptvalueiterator.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTVALUEITERATOR_H
+#define QSCRIPTVALUEITERATOR_H
+
+#include <QtScript/qscriptvalue.h>
+
+#ifndef QT_NO_SCRIPT
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Script)
+
+class QString;
+class QScriptString;
+
+class QScriptValueIteratorPrivate;
+class Q_SCRIPT_EXPORT QScriptValueIterator
+{
+public:
+ QScriptValueIterator(const QScriptValue &value);
+ ~QScriptValueIterator();
+
+ bool hasNext() const;
+ void next();
+
+ bool hasPrevious() const;
+ void previous();
+
+ QString name() const;
+ QScriptString scriptName() const;
+
+ QScriptValue value() const;
+ void setValue(const QScriptValue &value);
+
+ QScriptValue::PropertyFlags flags() const;
+
+ void remove();
+
+ void toFront();
+ void toBack();
+
+ QScriptValueIterator& operator=(QScriptValue &value);
+
+private:
+ QScriptValueIteratorPrivate *d_ptr;
+
+ Q_DECLARE_PRIVATE(QScriptValueIterator)
+ Q_DISABLE_COPY(QScriptValueIterator)
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QT_NO_SCRIPT
+
+#endif // QSCRIPTVALUEITERATOR_H
diff --git a/src/script/bridge/bridge.pri b/src/script/bridge/bridge.pri
new file mode 100644
index 0000000..585ccc0
--- /dev/null
+++ b/src/script/bridge/bridge.pri
@@ -0,0 +1,9 @@
+SOURCES += \
+ $$PWD/qscriptfunction.cpp \
+ $$PWD/qscriptvariant.cpp \
+ $$PWD/qscriptqobject.cpp
+
+HEADERS += \
+ $$PWD/qscriptfunction_p.h \
+ $$PWD/qscriptvariant_p.h \
+ $$PWD/qscriptqobject_p.h
diff --git a/src/script/bridge/qscriptfunction.cpp b/src/script/bridge/qscriptfunction.cpp
new file mode 100644
index 0000000..fd51df1
--- /dev/null
+++ b/src/script/bridge/qscriptfunction.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#include "qscriptfunction_p.h"
+
+#ifndef QT_NO_SCRIPT
+
+#include "private/qscriptengine_p.h"
+#include "qscriptcontext.h"
+#include "private/qscriptcontext_p.h"
+
+#include "JSGlobalObject.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace JSC
+{
+ASSERT_CLASS_FITS_IN_CELL(QScript::FunctionWrapper);
+ASSERT_CLASS_FITS_IN_CELL(QScript::FunctionWithArgWrapper);
+}
+
+namespace QScript
+{
+
+FunctionWrapper::FunctionWrapper(QScriptEngine *engine, int length, const JSC::Identifier &name,
+ QScriptEngine::FunctionSignature function)
+ : JSC::PrototypeFunction(QScriptEnginePrivate::get(engine)->globalObject->globalExec(),
+ length, name, proxyCall), data(new Data())
+{
+ data->engine = engine;
+ data->function = function;
+}
+
+FunctionWrapper::~FunctionWrapper()
+{
+ delete data;
+}
+
+JSC::ConstructType FunctionWrapper::getConstructData(JSC::ConstructData& consData)
+{
+ consData.native.function = proxyConstruct;
+ return JSC::ConstructTypeHost;
+}
+
+JSC::JSValue FunctionWrapper::proxyCall(JSC::ExecState *, JSC::JSObject *callee,
+ JSC::JSValue thisObject, const JSC::ArgList &args)
+{
+ FunctionWrapper *self = static_cast<FunctionWrapper*>(callee);
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(self->data->engine);
+ QScriptContextPrivate ctx_p(callee, thisObject, args,
+ /*calledAsConstructor=*/false, eng_p);
+ QScriptContext *ctx = QScriptContextPrivate::create(ctx_p);
+ QScriptValue result = self->data->function(ctx, self->data->engine);
+ delete ctx;
+ return eng_p->scriptValueToJSCValue(result);
+}
+
+JSC::JSObject* FunctionWrapper::proxyConstruct(JSC::ExecState *, JSC::JSObject *callee,
+ const JSC::ArgList &args)
+{
+ FunctionWrapper *self = static_cast<FunctionWrapper*>(callee);
+ QScriptValue object = self->data->engine->newObject();
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(self->data->engine);
+ QScriptContextPrivate ctx_p(callee, eng_p->scriptValueToJSCValue(object),
+ args, /*calledAsConstructor=*/true, eng_p);
+ QScriptContext *ctx = QScriptContextPrivate::create(ctx_p);
+ QScriptValue result = self->data->function(ctx, self->data->engine);
+ delete ctx;
+ if (result.isObject())
+ return static_cast<JSC::JSObject*>(JSC::asObject(eng_p->scriptValueToJSCValue(result)));
+ return static_cast<JSC::JSObject*>(JSC::asObject(eng_p->scriptValueToJSCValue(object)));
+}
+
+FunctionWithArgWrapper::FunctionWithArgWrapper(QScriptEngine *engine, int length, const JSC::Identifier &name,
+ QScriptEngine::FunctionWithArgSignature function, void *arg)
+ : JSC::PrototypeFunction(QScriptEnginePrivate::get(engine)->globalObject->globalExec(),
+ length, name, /*proxyCall*/0), data(new Data())
+{
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+ data->engine = engine;
+ data->function = function;
+ data->arg = arg;
+}
+
+FunctionWithArgWrapper::~FunctionWithArgWrapper()
+{
+ delete data;
+}
+
+JSC::ConstructType FunctionWithArgWrapper::getConstructData(JSC::ConstructData& consData)
+{
+ consData.native.function = proxyConstruct;
+ return JSC::ConstructTypeHost;
+}
+
+JSC::JSValue FunctionWithArgWrapper::proxyCall(JSC::ExecState *, JSC::JSObject *callee,
+ JSC::JSValue thisObject, const JSC::ArgList &args)
+{
+ FunctionWithArgWrapper *self = static_cast<FunctionWithArgWrapper*>(callee);
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(self->data->engine);
+ QScriptContextPrivate ctx_p(callee, thisObject, args,
+ /*calledAsConstructor=*/false, eng_p);
+ QScriptContext *ctx = QScriptContextPrivate::create(ctx_p);
+ QScriptValue result = self->data->function(ctx, self->data->engine, self->data->arg);
+ delete ctx;
+ return eng_p->scriptValueToJSCValue(result);
+}
+
+JSC::JSObject* FunctionWithArgWrapper::proxyConstruct(JSC::ExecState *, JSC::JSObject *callee,
+ const JSC::ArgList &args)
+{
+ FunctionWithArgWrapper *self = static_cast<FunctionWithArgWrapper*>(callee);
+ QScriptValue object = self->data->engine->newObject();
+ QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(self->data->engine);
+ QScriptContextPrivate ctx_p(callee, eng_p->scriptValueToJSCValue(object),
+ args, /*calledAsConstructor=*/true, eng_p);
+ QScriptContext *ctx = QScriptContextPrivate::create(ctx_p);
+ QScriptValue result = self->data->function(ctx, self->data->engine, self->data->arg);
+ delete ctx;
+ if (result.isObject())
+ return static_cast<JSC::JSObject*>(JSC::asObject(eng_p->scriptValueToJSCValue(result)));
+ return static_cast<JSC::JSObject*>(JSC::asObject(eng_p->scriptValueToJSCValue(object)));
+}
+
+} // namespace QScript
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
diff --git a/src/script/bridge/qscriptfunction_p.h b/src/script/bridge/qscriptfunction_p.h
new file mode 100644
index 0000000..87e3d59
--- /dev/null
+++ b/src/script/bridge/qscriptfunction_p.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTFUNCTION_P_H
+#define QSCRIPTFUNCTIOn_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+
+#ifndef QT_NO_SCRIPT
+
+#include "qscriptengine.h"
+
+#include "PrototypeFunction.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QScript
+{
+
+class FunctionWrapper : public JSC::PrototypeFunction // ### subclass InternalFunction instead
+{
+public:
+ // work around CELL_SIZE limitation
+ struct Data
+ {
+ QScriptEngine *engine;
+ QScriptEngine::FunctionSignature function;
+ };
+
+ FunctionWrapper(QScriptEngine *, int length, const JSC::Identifier&, QScriptEngine::FunctionSignature);
+ ~FunctionWrapper();
+
+private:
+ virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
+
+ static JSC::JSValue JSC_HOST_CALL proxyCall(JSC::ExecState *, JSC::JSObject *, JSC::JSValue, const JSC::ArgList &);
+ static JSC::JSObject* proxyConstruct(JSC::ExecState *, JSC::JSObject *, const JSC::ArgList &);
+
+private:
+ Data *data;
+};
+
+class FunctionWithArgWrapper : public JSC::PrototypeFunction
+{
+public:
+ // work around CELL_SIZE limitation
+ struct Data
+ {
+ QScriptEngine *engine;
+ QScriptEngine::FunctionWithArgSignature function;
+ void *arg;
+ };
+
+ FunctionWithArgWrapper(QScriptEngine *, int length, const JSC::Identifier&, QScriptEngine::FunctionWithArgSignature, void *);
+ ~FunctionWithArgWrapper();
+
+private:
+ virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
+
+ static JSC::JSValue proxyCall(JSC::ExecState *, JSC::JSObject *, JSC::JSValue , const JSC::ArgList &);
+ static JSC::JSObject* proxyConstruct(JSC::ExecState *, JSC::JSObject *, const JSC::ArgList &);
+
+private:
+ Data *data;
+};
+
+} // namespace QScript
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/bridge/qscriptqobject.cpp b/src/script/bridge/qscriptqobject.cpp
new file mode 100644
index 0000000..84f6108d
--- /dev/null
+++ b/src/script/bridge/qscriptqobject.cpp
@@ -0,0 +1,1338 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#include "qscriptqobject_p.h"
+
+#ifndef QT_NO_SCRIPT
+
+#include <QtCore/qmetaobject.h>
+#include <QtCore/qvarlengtharray.h>
+#include <QtCore/qdebug.h>
+#include <QtScript/qscriptable.h>
+#include "../api/qscriptengine_p.h"
+#include "../api/qscriptable_p.h"
+
+#include "Error.h"
+#include "PrototypeFunction.h"
+#include "PropertyNameArray.h"
+#include "JSFunction.h"
+#include "JSString.h"
+#include "JSValue.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace JSC
+{
+ASSERT_CLASS_FITS_IN_CELL(QScript::QObjectWrapperObject);
+ASSERT_CLASS_FITS_IN_CELL(QScript::QObjectPrototype);
+}
+
+namespace QScript
+{
+
+struct QObjectConnection
+{
+ int slotIndex;
+ JSC::JSValue receiver;
+ JSC::JSValue slot;
+ JSC::JSValue senderWrapper;
+
+ QObjectConnection(int i, JSC::JSValue r, JSC::JSValue s,
+ JSC::JSValue sw)
+ : slotIndex(i), receiver(r), slot(s), senderWrapper(sw) {}
+ QObjectConnection() : slotIndex(-1) {}
+
+ bool hasTarget(JSC::JSValue r, JSC::JSValue s) const
+ {
+ if (r.isObject() != receiver.isObject())
+ return false;
+ if ((r.isObject() && receiver.isObject())
+ && (r != receiver)) {
+ return false;
+ }
+ return (s == slot);
+ }
+
+ void mark()
+ {
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+/* if (senderWrapper && !senderWrapper->isMarked()) {
+ // see if the sender should be marked or not
+ if ((inst->ownership == QScriptEngine::ScriptOwnership)
+ || ((inst->ownership == QScriptEngine::AutoOwnership)
+ && inst->value && !inst->value->parent())) {
+ senderWrapper.invalidate();
+ } else {
+ senderWrapper.mark(generation);
+ }
+ }*/
+ if (receiver)
+ receiver.mark();
+ if (slot)
+ slot.mark();
+ }
+};
+
+class QObjectConnectionManager: public QObject
+{
+public:
+ QObjectConnectionManager(QScriptEnginePrivate *engine);
+ ~QObjectConnectionManager();
+
+ bool addSignalHandler(QObject *sender, const char *signal,
+ JSC::JSValue receiver,
+ JSC::JSValue slot,
+ JSC::JSValue senderWrapper = 0);
+ bool removeSignalHandler(QObject *sender, const char *signal,
+ JSC::JSValue receiver,
+ JSC::JSValue slot);
+
+ static const QMetaObject staticMetaObject;
+ virtual const QMetaObject *metaObject() const;
+ virtual void *qt_metacast(const char *);
+ virtual int qt_metacall(QMetaObject::Call, int, void **argv);
+
+ void execute(int slotIndex, void **argv);
+
+ void mark();
+
+private:
+ QScriptEnginePrivate *engine;
+ int slotCounter;
+ QVector<QVector<QObjectConnection> > connections;
+};
+
+static bool hasMethodAccess(const QMetaMethod &method, int index, const QScriptEngine::QObjectWrapOptions &opt)
+{
+ return (method.access() != QMetaMethod::Private)
+ && ((index != 2) || !(opt & QScriptEngine::ExcludeDeleteLater));
+}
+
+static bool isEnumerableMetaProperty(const QMetaProperty &prop,
+ const QMetaObject *mo, int index)
+{
+ return prop.isScriptable() && prop.isValid()
+ // the following lookup is to ensure that we have the
+ // "most derived" occurrence of the property with this name
+ && (mo->indexOfProperty(prop.name()) == index);
+}
+
+static inline QByteArray methodName(const QMetaMethod &method)
+{
+ QByteArray signature = method.signature();
+ return signature.left(signature.indexOf('('));
+}
+
+static int indexOfMetaEnum(const QMetaObject *meta, const QByteArray &str)
+{
+ QByteArray scope;
+ QByteArray name;
+ int scopeIdx = str.indexOf("::");
+ if (scopeIdx != -1) {
+ scope = str.left(scopeIdx);
+ name = str.mid(scopeIdx + 2);
+ } else {
+ name = str;
+ }
+ for (int i = meta->enumeratorCount() - 1; i >= 0; --i) {
+ QMetaEnum m = meta->enumerator(i);
+ if ((m.name() == name)/* && (scope.isEmpty() || (m.scope() == scope))*/)
+ return i;
+ }
+ return -1;
+}
+
+static inline QScriptable *scriptableFromQObject(QObject *qobj)
+{
+ void *ptr = qobj->qt_metacast("QScriptable");
+ return reinterpret_cast<QScriptable*>(ptr);
+}
+
+JSC::UString qtStringToJSCUString(const QString &str);
+QString qtStringFromJSCUString(const JSC::UString &str);
+
+static JSC::JSValue JSC_HOST_CALL QtFunction_call(JSC::ExecState *exec, JSC::JSObject*,
+ JSC::JSValue thisValue, const JSC::ArgList &args);
+
+class QtFunction: public JSC::InternalFunction
+{
+public:
+ // work around CELL_SIZE limitation
+ struct Data
+ {
+ JSC::JSValue object;
+ int initialIndex;
+ bool maybeOverloaded;
+
+ Data(JSC::JSValue o, int ii, bool mo)
+ : object(o), initialIndex(ii), maybeOverloaded(mo) {}
+ };
+
+ QtFunction(JSC::JSValue object, int initialIndex, bool maybeOverloaded,
+ JSC::JSGlobalData*, WTF::PassRefPtr<JSC::Structure>, const JSC::Identifier&);
+ virtual ~QtFunction();
+
+ virtual JSC::CallType getCallData(JSC::CallData&);
+ virtual void mark();
+
+ virtual const JSC::ClassInfo* classInfo() const { return &info; }
+ static const JSC::ClassInfo info;
+
+ JSC::JSValue call(JSC::ExecState *exec, JSC::JSValue thisValue,
+ const JSC::ArgList &args);
+
+private:
+ Data *data;
+};
+
+QtFunction::QtFunction(JSC::JSValue object, int initialIndex, bool maybeOverloaded,
+ JSC::JSGlobalData *data, WTF::PassRefPtr<JSC::Structure> sid,
+ const JSC::Identifier &ident)
+ : JSC::InternalFunction(data, sid, ident),
+ data(new Data(object, initialIndex, maybeOverloaded))
+{
+}
+
+QtFunction::~QtFunction()
+{
+ delete data;
+}
+
+JSC::CallType QtFunction::getCallData(JSC::CallData &callData)
+{
+ callData.native.function = QtFunction_call;
+ return JSC::CallTypeHost;
+}
+
+void QtFunction::mark()
+{
+ data->object.mark();
+}
+
+class QScriptMetaType
+{
+public:
+ enum Kind {
+ Invalid,
+ Variant,
+ MetaType,
+ Unresolved,
+ MetaEnum
+ };
+
+ inline QScriptMetaType()
+ : m_kind(Invalid) { }
+
+ inline Kind kind() const
+ { return m_kind; }
+
+ int typeId() const;
+
+ inline bool isValid() const
+ { return (m_kind != Invalid); }
+
+ inline bool isVariant() const
+ { return (m_kind == Variant); }
+
+ inline bool isMetaType() const
+ { return (m_kind == MetaType); }
+
+ inline bool isUnresolved() const
+ { return (m_kind == Unresolved); }
+
+ inline bool isMetaEnum() const
+ { return (m_kind == MetaEnum); }
+
+ QByteArray name() const;
+
+ inline int enumeratorIndex() const
+ { Q_ASSERT(isMetaEnum()); return m_typeId; }
+
+ static inline QScriptMetaType variant()
+ { return QScriptMetaType(Variant); }
+
+ static inline QScriptMetaType metaType(int typeId, const QByteArray &name)
+ { return QScriptMetaType(MetaType, typeId, name); }
+
+ static inline QScriptMetaType metaEnum(int enumIndex, const QByteArray &name)
+ { return QScriptMetaType(MetaEnum, enumIndex, name); }
+
+ static inline QScriptMetaType unresolved(const QByteArray &name)
+ { return QScriptMetaType(Unresolved, /*typeId=*/0, name); }
+
+private:
+ inline QScriptMetaType(Kind kind, int typeId = 0, const QByteArray &name = QByteArray())
+ : m_kind(kind), m_typeId(typeId), m_name(name) { }
+
+ Kind m_kind;
+ int m_typeId;
+ QByteArray m_name;
+};
+
+int QScriptMetaType::typeId() const
+{
+ if (isVariant())
+ return QMetaType::type("QVariant");
+ return isMetaEnum() ? 2/*int*/ : m_typeId;
+}
+
+QByteArray QScriptMetaType::name() const
+{
+ if (!m_name.isEmpty())
+ return m_name;
+ else if (m_kind == Variant)
+ return "QVariant";
+ return QMetaType::typeName(typeId());
+}
+
+class QScriptMetaMethod
+{
+public:
+ inline QScriptMetaMethod()
+ { }
+ inline QScriptMetaMethod(const QByteArray &name, const QVector<QScriptMetaType> &types)
+ : m_name(name), m_types(types), m_firstUnresolvedIndex(-1)
+ {
+ QVector<QScriptMetaType>::const_iterator it;
+ for (it = m_types.constBegin(); it != m_types.constEnd(); ++it) {
+ if ((*it).kind() == QScriptMetaType::Unresolved) {
+ m_firstUnresolvedIndex = it - m_types.constBegin();
+ break;
+ }
+ }
+ }
+ inline bool isValid() const
+ { return !m_types.isEmpty(); }
+
+ QByteArray name() const
+ { return m_name; }
+
+ inline QScriptMetaType returnType() const
+ { return m_types.at(0); }
+
+ inline int argumentCount() const
+ { return m_types.count() - 1; }
+
+ inline QScriptMetaType argumentType(int arg) const
+ { return m_types.at(arg + 1); }
+
+ inline bool fullyResolved() const
+ { return m_firstUnresolvedIndex == -1; }
+
+ inline bool hasUnresolvedReturnType() const
+ { return (m_firstUnresolvedIndex == 0); }
+
+ inline int firstUnresolvedIndex() const
+ { return m_firstUnresolvedIndex; }
+
+ inline int count() const
+ { return m_types.count(); }
+
+ inline QScriptMetaType type(int index) const
+ { return m_types.at(index); }
+
+private:
+ QByteArray m_name;
+ QVector<QScriptMetaType> m_types;
+ int m_firstUnresolvedIndex;
+};
+
+struct QScriptMetaArguments
+{
+ int matchDistance;
+ int index;
+ QScriptMetaMethod method;
+ QVarLengthArray<QVariant, 9> args;
+
+ inline QScriptMetaArguments(int dist, int idx, const QScriptMetaMethod &mtd,
+ const QVarLengthArray<QVariant, 9> &as)
+ : matchDistance(dist), index(idx), method(mtd), args(as) { }
+ inline QScriptMetaArguments()
+ : index(-1) { }
+
+ inline bool isValid() const
+ { return (index != -1); }
+};
+
+JSC::JSValue QtFunction::call(JSC::ExecState *exec, JSC::JSValue thisValue,
+ const JSC::ArgList &scriptArgs)
+{
+ Q_ASSERT(data->object.isObject(&QObjectWrapperObject::info));
+ QObjectWrapperObject *wrapper = static_cast<QObjectWrapperObject*>(JSC::asObject(data->object));
+ QScriptEnginePrivate *engine = static_cast<QScript::GlobalObject*>(exec->dynamicGlobalObject())->engine;
+ QObject *qobj = wrapper->value();
+ Q_ASSERT_X(qobj != 0, "QtFunction::call", "handle the case when QObject has been deleted");
+
+ const QMetaObject *meta = qobj->metaObject();
+ QObject *thisQObject;
+ if (thisValue.isObject(&QObjectWrapperObject::info))
+ thisQObject = static_cast<QObjectWrapperObject*>(JSC::asObject(thisValue))->value();
+ else
+ thisQObject = qobj; // ### TypeError
+
+ if (!meta->cast(thisQObject)) {
+ // invoking a function in the prototype
+ thisQObject = qobj;
+ }
+
+ QByteArray funName;
+ QScriptMetaMethod chosenMethod;
+ int chosenIndex = -1;
+ QVarLengthArray<QVariant, 9> args;
+ QVector<QScriptMetaArguments> candidates;
+ QVector<QScriptMetaArguments> unresolved;
+ QVector<int> tooFewArgs;
+ QVector<int> conversionFailed;
+ int index;
+ for (index = data->initialIndex; index >= 0; --index) {
+ QMetaMethod method = meta->method(index);
+
+ if (index == data->initialIndex)
+ funName = methodName(method);
+ else {
+ if (methodName(method) != funName)
+ continue;
+ }
+
+ QVector<QScriptMetaType> types;
+ // resolve return type
+ QByteArray returnTypeName = method.typeName();
+ int rtype = QMetaType::type(returnTypeName);
+ if ((rtype == 0) && !returnTypeName.isEmpty()) {
+ if (returnTypeName == "QVariant") {
+ types.append(QScriptMetaType::variant());
+ } else {
+ int enumIndex = indexOfMetaEnum(meta, returnTypeName);
+ if (enumIndex != -1)
+ types.append(QScriptMetaType::metaEnum(enumIndex, returnTypeName));
+ else
+ types.append(QScriptMetaType::unresolved(returnTypeName));
+ }
+ } else {
+/* if (callType == QMetaMethod::Constructor)
+ types.append(QScriptMetaType::metaType(QMetaType::QObjectStar, "QObject*"));
+ else*/ if (returnTypeName == "QVariant")
+ types.append(QScriptMetaType::variant());
+ else
+ types.append(QScriptMetaType::metaType(rtype, returnTypeName));
+ }
+
+ // resolve argument types
+ QList<QByteArray> parameterTypeNames = method.parameterTypes();
+ for (int i = 0; i < parameterTypeNames.count(); ++i) {
+ QByteArray argTypeName = parameterTypeNames.at(i);
+ int atype = QMetaType::type(argTypeName);
+ if (atype == 0) {
+ if (argTypeName == "QVariant") {
+ types.append(QScriptMetaType::variant());
+ } else {
+ int enumIndex = indexOfMetaEnum(meta, argTypeName);
+ if (enumIndex != -1)
+ types.append(QScriptMetaType::metaEnum(enumIndex, argTypeName));
+ else
+ types.append(QScriptMetaType::unresolved(argTypeName));
+ }
+ } else {
+ if (argTypeName == "QVariant")
+ types.append(QScriptMetaType::variant());
+ else
+ types.append(QScriptMetaType::metaType(atype, argTypeName));
+ }
+ }
+
+ QScriptMetaMethod mtd = QScriptMetaMethod(methodName(method), types);
+
+ if (args.count() < mtd.argumentCount()) {
+ tooFewArgs.append(index);
+ continue;
+ }
+
+ if (!mtd.fullyResolved()) {
+ // remember it so we can give an error message later, if necessary
+ unresolved.append(QScriptMetaArguments(/*matchDistance=*/INT_MAX, index,
+ mtd, QVarLengthArray<QVariant, 9>()));
+ if (mtd.hasUnresolvedReturnType())
+ continue;
+ }
+
+ if (args.count() != mtd.count())
+ args.resize(mtd.count());
+
+ QScriptMetaType retType = mtd.returnType();
+ args[0] = QVariant(retType.typeId(), (void *)0); // the result
+
+ // try to convert arguments
+ bool converted = true;
+ int matchDistance = 0;
+ for (int i = 0; converted && i < mtd.argumentCount(); ++i) {
+ QScriptValue actual = engine->scriptValueFromJSCValue(scriptArgs.at(i));
+ QScriptMetaType argType = mtd.argumentType(i);
+ int tid = -1;
+ QVariant v;
+ if (argType.isUnresolved()) {
+ v = QVariant(QMetaType::QObjectStar, (void *)0);
+ converted = engine->convertToNativeQObject(
+ actual, argType.name(), reinterpret_cast<void* *>(v.data()));
+ } else if (argType.isVariant()) {
+ if (actual.isVariant()) {
+ v = actual.toVariant();
+ } else {
+ v = actual.toVariant();
+ converted = v.isValid() || actual.isUndefined() || actual.isNull();
+ }
+ } else {
+ tid = argType.typeId();
+ v = QVariant(tid, (void *)0);
+ converted = QScriptEnginePrivate::convert(actual, tid, v.data(), engine);
+ // ###
+// if (engine->hasUncaughtException())
+// return;
+ }
+
+ if (!converted) {
+ if (actual.isVariant()) {
+ if (tid == -1)
+ tid = argType.typeId();
+ QVariant vv = actual.toVariant();
+ if (vv.canConvert(QVariant::Type(tid))) {
+ v = vv;
+ converted = v.convert(QVariant::Type(tid));
+ if (converted && (vv.userType() != tid))
+ matchDistance += 10;
+ } else {
+ QByteArray vvTypeName = vv.typeName();
+ if (vvTypeName.endsWith('*')
+ && (vvTypeName.left(vvTypeName.size()-1) == argType.name())) {
+ v = QVariant(tid, *reinterpret_cast<void* *>(vv.data()));
+ converted = true;
+ matchDistance += 10;
+ }
+ }
+ } else if (actual.isNumber()) {
+ // see if it's an enum value
+ QMetaEnum m;
+ if (argType.isMetaEnum()) {
+ m = meta->enumerator(argType.enumeratorIndex());
+ } else {
+ int mi = indexOfMetaEnum(meta, argType.name());
+ if (mi != -1)
+ m = meta->enumerator(mi);
+ }
+ if (m.isValid()) {
+ int ival = actual.toInt32();
+ if (m.valueToKey(ival) != 0) {
+ qVariantSetValue(v, ival);
+ converted = true;
+ matchDistance += 10;
+ }
+ }
+ }
+ } else {
+ // determine how well the conversion matched
+ if (actual.isNumber()) {
+ switch (tid) {
+ case QMetaType::Double:
+ // perfect
+ break;
+ case QMetaType::Float:
+ matchDistance += 1;
+ break;
+ case QMetaType::LongLong:
+ case QMetaType::ULongLong:
+ matchDistance += 2;
+ break;
+ case QMetaType::Long:
+ case QMetaType::ULong:
+ matchDistance += 3;
+ break;
+ case QMetaType::Int:
+ case QMetaType::UInt:
+ matchDistance += 4;
+ break;
+ case QMetaType::Short:
+ case QMetaType::UShort:
+ matchDistance += 5;
+ break;
+ case QMetaType::Char:
+ case QMetaType::UChar:
+ matchDistance += 6;
+ break;
+ default:
+ matchDistance += 10;
+ break;
+ }
+ } else if (actual.isString()) {
+ switch (tid) {
+ case QMetaType::QString:
+ // perfect
+ break;
+ default:
+ matchDistance += 10;
+ break;
+ }
+ } else if (actual.isBoolean()) {
+ switch (tid) {
+ case QMetaType::Bool:
+ // perfect
+ break;
+ default:
+ matchDistance += 10;
+ break;
+ }
+ } else if (actual.isDate()) {
+ switch (tid) {
+ case QMetaType::QDateTime:
+ // perfect
+ break;
+ case QMetaType::QDate:
+ matchDistance += 1;
+ break;
+ case QMetaType::QTime:
+ matchDistance += 2;
+ break;
+ default:
+ matchDistance += 10;
+ break;
+ }
+ } else if (actual.isRegExp()) {
+ switch (tid) {
+ case QMetaType::QRegExp:
+ // perfect
+ break;
+ default:
+ matchDistance += 10;
+ break;
+ }
+ } else if (actual.isVariant()) {
+ if (argType.isVariant()
+ || (actual.toVariant().userType() == tid)) {
+ // perfect
+ } else {
+ matchDistance += 10;
+ }
+ } else if (actual.isArray()) {
+ switch (tid) {
+ case QMetaType::QStringList:
+ case QMetaType::QVariantList:
+ matchDistance += 5;
+ break;
+ default:
+ matchDistance += 10;
+ break;
+ }
+ } else if (actual.isQObject()) {
+ switch (tid) {
+ case QMetaType::QObjectStar:
+ case QMetaType::QWidgetStar:
+ // perfect
+ break;
+ default:
+ matchDistance += 10;
+ break;
+ }
+ } else if (actual.isNull()) {
+ switch (tid) {
+ case QMetaType::VoidStar:
+ case QMetaType::QObjectStar:
+ case QMetaType::QWidgetStar:
+ // perfect
+ break;
+ default:
+ if (!argType.name().endsWith('*'))
+ matchDistance += 10;
+ break;
+ }
+ } else {
+ matchDistance += 10;
+ }
+ }
+
+ if (converted)
+ args[i+1] = v;
+ }
+
+ if (converted) {
+ if ((scriptArgs.size() == (size_t)mtd.argumentCount())
+ && (matchDistance == 0)) {
+ // perfect match, use this one
+ chosenMethod = mtd;
+ chosenIndex = index;
+ break;
+ } else {
+ QScriptMetaArguments metaArgs(matchDistance, index, mtd, args);
+ if (candidates.isEmpty()) {
+ candidates.append(metaArgs);
+ } else {
+ QScriptMetaArguments otherArgs = candidates.at(0);
+ if ((args.count() > otherArgs.args.count())
+ || ((args.count() == otherArgs.args.count())
+ && (matchDistance <= otherArgs.matchDistance))) {
+ candidates.prepend(metaArgs);
+ } else {
+ candidates.append(metaArgs);
+ }
+ }
+ }
+ } else if (mtd.fullyResolved()) {
+ conversionFailed.append(index);
+ }
+
+ if (!data->maybeOverloaded)
+ break;
+ }
+
+ JSC::JSValue result;
+ if ((chosenIndex == -1) && candidates.isEmpty()) {
+// context->calleeMetaIndex = initialIndex;
+//#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
+// engine->notifyFunctionEntry(context);
+//#endif
+ if (!conversionFailed.isEmpty()) {
+ QString message = QString::fromLatin1("incompatible type of argument(s) in call to %0(); candidates were\n")
+ .arg(QLatin1String(funName));
+ for (int i = 0; i < conversionFailed.size(); ++i) {
+ if (i > 0)
+ message += QLatin1String("\n");
+ QMetaMethod mtd = meta->method(conversionFailed.at(i));
+ message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature()));
+ }
+ result = JSC::throwError(exec, JSC::TypeError, qtStringToJSCUString(message));
+ } else if (!unresolved.isEmpty()) {
+ QScriptMetaArguments argsInstance = unresolved.first();
+ int unresolvedIndex = argsInstance.method.firstUnresolvedIndex();
+ Q_ASSERT(unresolvedIndex != -1);
+ QScriptMetaType unresolvedType = argsInstance.method.type(unresolvedIndex);
+ QString unresolvedTypeName = QString::fromLatin1(unresolvedType.name());
+ QString message = QString::fromLatin1("cannot call %0(): ")
+ .arg(QString::fromLatin1(funName));
+ if (unresolvedIndex > 0) {
+ message.append(QString::fromLatin1("argument %0 has unknown type `%1'").
+ arg(unresolvedIndex).arg(unresolvedTypeName));
+ } else {
+ message.append(QString::fromLatin1("unknown return type `%0'")
+ .arg(unresolvedTypeName));
+ }
+ message.append(QString::fromLatin1(" (register the type with qScriptRegisterMetaType())"));
+ result = JSC::throwError(exec, JSC::TypeError, qtStringToJSCUString(message));
+ } else {
+ QString message = QString::fromLatin1("too few arguments in call to %0(); candidates are\n")
+ .arg(QLatin1String(funName));
+ for (int i = 0; i < tooFewArgs.size(); ++i) {
+ if (i > 0)
+ message += QLatin1String("\n");
+ QMetaMethod mtd = meta->method(tooFewArgs.at(i));
+ message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature()));
+ }
+ result = JSC::throwError(exec, JSC::SyntaxError, qtStringToJSCUString(message));
+ }
+ } else {
+ if (chosenIndex == -1) {
+ QScriptMetaArguments metaArgs = candidates.at(0);
+ if ((candidates.size() > 1)
+ && (metaArgs.args.count() == candidates.at(1).args.count())
+ && (metaArgs.matchDistance == candidates.at(1).matchDistance)) {
+ // ambiguous call
+ QString message = QString::fromLatin1("ambiguous call of overloaded function %0(); candidates were\n")
+ .arg(QLatin1String(funName));
+ for (int i = 0; i < candidates.size(); ++i) {
+ if (i > 0)
+ message += QLatin1String("\n");
+ QMetaMethod mtd = meta->method(candidates.at(i).index);
+ message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature()));
+ }
+ result = JSC::throwError(exec, JSC::TypeError, qtStringToJSCUString(message));
+ } else {
+ chosenMethod = metaArgs.method;
+ chosenIndex = metaArgs.index;
+ args = metaArgs.args;
+ }
+ }
+
+ if (chosenIndex != -1) {
+ // call it
+// context->calleeMetaIndex = chosenIndex;
+
+ QVarLengthArray<void*, 9> array(args.count());
+ void **params = array.data();
+ for (int i = 0; i < args.count(); ++i) {
+ const QVariant &v = args[i];
+ switch (chosenMethod.type(i).kind()) {
+ case QScriptMetaType::Variant:
+ params[i] = const_cast<QVariant*>(&v);
+ break;
+ case QScriptMetaType::MetaType:
+ case QScriptMetaType::MetaEnum:
+ case QScriptMetaType::Unresolved:
+ params[i] = const_cast<void*>(v.constData());
+ break;
+ default:
+ Q_ASSERT(0);
+ }
+ }
+
+ QScriptable *scriptable = 0;
+ if (thisQObject)
+ scriptable = scriptableFromQObject(thisQObject);
+ QScriptEngine *oldEngine = 0;
+ if (scriptable) {
+ oldEngine = QScriptablePrivate::get(scriptable)->engine;
+ QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine);
+ }
+
+// ### fixme
+//#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
+// engine->notifyFunctionEntry(context);
+//#endif
+
+/* if (callType == QMetaMethod::Constructor) {
+ Q_ASSERT(meta != 0);
+ meta->static_metacall(QMetaObject::CreateInstance, chosenIndex, params);
+ } else*/ {
+ Q_ASSERT(thisQObject != 0);
+ thisQObject->qt_metacall(QMetaObject::InvokeMetaMethod, chosenIndex, params);
+ }
+
+ if (scriptable)
+ QScriptablePrivate::get(scriptable)->engine = oldEngine;
+
+ if (exec->hadException()) {
+ result = exec->exception() ; // propagate
+ } else {
+ QScriptMetaType retType = chosenMethod.returnType();
+ if (retType.isVariant()) {
+ result = engine->jscValueFromVariant(*(QVariant *)params[0]);
+ } else if (retType.typeId() != 0) {
+ result = engine->scriptValueToJSCValue(engine->create(retType.typeId(), params[0]));
+ if (!result) {
+ QScriptValue sv = QScriptEnginePrivate::get(engine)->newVariant(QVariant(retType.typeId(), params[0]));
+ result = engine->scriptValueToJSCValue(sv);
+ }
+ } else {
+ result = JSC::jsUndefined();
+ }
+ }
+ }
+ }
+
+ return JSC::JSValue();
+}
+
+const JSC::ClassInfo QtFunction::info = { "QtFunction", 0, 0, 0 };
+
+JSC::JSValue QtFunction_call(JSC::ExecState *exec, JSC::JSObject *callee,
+ JSC::JSValue thisValue, const JSC::ArgList &args)
+{
+ if (!callee->isObject(&QtFunction::info))
+ return throwError(exec, JSC::TypeError);
+ return static_cast<QtFunction*>(callee)->call(exec, thisValue, args);
+}
+
+const JSC::ClassInfo QObjectWrapperObject::info = { "QObject", 0, 0, 0 };
+
+QObjectWrapperObject::QObjectWrapperObject(
+ QObject *object, QScriptEngine::ValueOwnership ownership,
+ const QScriptEngine::QObjectWrapOptions &options,
+ WTF::PassRefPtr<JSC::Structure> sid)
+ : JSC::JSObject(sid), data(new Data(object, ownership, options))
+{
+}
+
+QObjectWrapperObject::~QObjectWrapperObject()
+{
+ switch (data->ownership) {
+ case QScriptEngine::QtOwnership:
+ break;
+ case QScriptEngine::ScriptOwnership:
+ if (data->value)
+ delete data->value; // ### fixme
+// eng->disposeQObject(value);
+ break;
+ case QScriptEngine::AutoOwnership:
+ if (data->value && !data->value->parent())
+ delete data->value; // ### fixme
+// eng->disposeQObject(value);
+ break;
+ }
+ delete data;
+}
+
+bool QObjectWrapperObject::getOwnPropertySlot(JSC::ExecState *exec,
+ const JSC::Identifier &propertyName,
+ JSC::PropertySlot &slot)
+{
+ QByteArray name = qtStringFromJSCUString(propertyName.ustring()).toLatin1();
+ QObject *qobject = data->value;
+ if (!qobject) {
+ QString message = QString::fromLatin1("cannot access member `%0' of deleted QObject")
+ .arg(QString::fromLatin1(name));
+ JSC::throwError(exec, JSC::GeneralError, qtStringToJSCUString(message));
+ return false;
+ }
+
+ const QScriptEngine::QObjectWrapOptions &opt = data->options;
+ const QMetaObject *meta = qobject->metaObject();
+ QScriptEnginePrivate *eng = static_cast<QScript::GlobalObject*>(exec->dynamicGlobalObject())->engine;
+ int index = -1;
+ if (name.contains('(')) {
+ QByteArray normalized = QMetaObject::normalizedSignature(name);
+ if (-1 != (index = meta->indexOfMethod(normalized))) {
+ QMetaMethod method = meta->method(index);
+ if (hasMethodAccess(method, index, opt)) {
+ if (!(opt & QScriptEngine::ExcludeSuperClassMethods)
+ || (index >= meta->methodOffset())) {
+ QtFunction *fun = new (exec)QtFunction(
+ this, index, /*maybeOverloaded=*/false,
+ &exec->globalData(), exec->dynamicGlobalObject()->functionStructure(),
+ propertyName);
+ slot.setValue(fun);
+ return true;
+ }
+ }
+ }
+ }
+
+ index = meta->indexOfProperty(name);
+ if (index != -1) {
+ QMetaProperty prop = meta->property(index);
+ if (prop.isScriptable()) {
+ if (!(opt & QScriptEngine::ExcludeSuperClassProperties)
+ || (index >= meta->propertyOffset())) {
+ JSC::JSValue val = eng->jscValueFromVariant(prop.read(qobject));
+ slot.setValue(val);
+ return true;
+ }
+ }
+ }
+
+ index = qobject->dynamicPropertyNames().indexOf(name);
+ if (index != -1) {
+ JSC::JSValue val = eng->jscValueFromVariant(qobject->property(name));
+ slot.setValue(val);
+ return true;
+ }
+
+ const int offset = (opt & QScriptEngine::ExcludeSuperClassMethods)
+ ? meta->methodOffset() : 0;
+ for (index = meta->methodCount() - 1; index >= offset; --index) {
+ QMetaMethod method = meta->method(index);
+ if (hasMethodAccess(method, index, opt)
+ && (methodName(method) == name)) {
+ QtFunction *fun = new (exec)QtFunction(
+ this, index, /*maybeOverloaded=*/true,
+ &exec->globalData(), exec->dynamicGlobalObject()->functionStructure(),
+ propertyName);
+ slot.setValue(fun);
+ return true;
+ }
+ }
+
+ if (!(opt & QScriptEngine::ExcludeChildObjects)) {
+ QList<QObject*> children = qobject->children();
+ for (index = 0; index < children.count(); ++index) {
+ QObject *child = children.at(index);
+ if (child->objectName() == qtStringFromJSCUString(propertyName.ustring())) {
+ QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject;
+ QScriptValue tmp = QScriptEnginePrivate::get(eng)->newQObject(child, QScriptEngine::QtOwnership, opt);
+ slot.setValue(eng->scriptValueToJSCValue(tmp));
+ return true;
+ }
+ }
+ }
+
+ return JSC::JSObject::getOwnPropertySlot(exec, propertyName, slot);
+}
+
+void QObjectWrapperObject::put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
+ JSC::JSValue value, JSC::PutPropertySlot &slot)
+{
+ QByteArray name = qtStringFromJSCUString(propertyName.ustring()).toLatin1();
+ QObject *qobject = data->value;
+ if (!qobject) {
+ QString message = QString::fromLatin1("cannot access member `%0' of deleted QObject")
+ .arg(QString::fromLatin1(name));
+ JSC::throwError(exec, JSC::GeneralError, qtStringToJSCUString(message));
+ return;
+ }
+
+ const QScriptEngine::QObjectWrapOptions &opt = data->options;
+ const QMetaObject *meta = qobject->metaObject();
+ QScriptEnginePrivate *eng = static_cast<QScript::GlobalObject*>(exec->dynamicGlobalObject())->engine;
+ int index = -1;
+ if (name.contains('(')) {
+ QByteArray normalized = QMetaObject::normalizedSignature(name);
+ if (-1 != (index = meta->indexOfMethod(normalized))) {
+ QMetaMethod method = meta->method(index);
+ if (hasMethodAccess(method, index, opt)) {
+ if (!(opt & QScriptEngine::ExcludeSuperClassMethods)
+ || (index >= meta->methodOffset())) {
+ Q_ASSERT(0);
+ return;
+ }
+ }
+ }
+ }
+
+ index = meta->indexOfProperty(name);
+ if (index != -1) {
+ QMetaProperty prop = meta->property(index);
+ if (prop.isScriptable()) {
+ if (!(opt & QScriptEngine::ExcludeSuperClassProperties)
+ || (index >= meta->propertyOffset())) {
+ QVariant v = eng->jscValueToVariant(value, prop.userType());
+ (void)prop.write(qobject, v);
+ return;
+ }
+ }
+ }
+
+ index = qobject->dynamicPropertyNames().indexOf(name);
+ if (index != -1) {
+ QVariant v = eng->scriptValueFromJSCValue(value).toVariant();
+ (void)qobject->setProperty(name, v);
+ return;
+ }
+
+ JSC::JSObject::put(exec, propertyName, value, slot);
+}
+
+bool QObjectWrapperObject::deleteProperty(JSC::ExecState *exec,
+ const JSC::Identifier& propertyName)
+{
+ QByteArray name = qtStringFromJSCUString(propertyName.ustring()).toLatin1();
+ QObject *qobject = data->value;
+ if (!qobject) {
+ QString message = QString::fromLatin1("cannot access member `%0' of deleted QObject")
+ .arg(QString::fromLatin1(name));
+ JSC::throwError(exec, JSC::GeneralError, qtStringToJSCUString(message));
+ return false;
+ }
+
+ int index = qobject->dynamicPropertyNames().indexOf(name);
+ if (index != -1) {
+ (void)qobject->setProperty(name, QVariant());
+ return true;
+ }
+
+ return JSC::JSObject::deleteProperty(exec, propertyName);
+}
+
+void QObjectWrapperObject::getPropertyNames(JSC::ExecState *exec, JSC::PropertyNameArray &propertyNames)
+{
+ QObject *qobject = data->value;
+ if (!qobject) {
+ QString message = QString::fromLatin1("cannot get property names of deleted QObject");
+ JSC::throwError(exec, JSC::GeneralError, qtStringToJSCUString(message));
+ return;
+ }
+
+ const QScriptEngine::QObjectWrapOptions &opt = data->options;
+ const QMetaObject *meta = qobject->metaObject();
+ {
+ int i = (opt & QScriptEngine::ExcludeSuperClassProperties)
+ ? meta->propertyOffset() : 0;
+ for ( ; i < meta->propertyCount(); ++i) {
+ QMetaProperty prop = meta->property(i);
+ if (isEnumerableMetaProperty(prop, meta, i)) {
+ QString name = QString::fromLatin1(prop.name());
+ propertyNames.add(JSC::Identifier(exec, qtStringToJSCUString(name)));
+ }
+ }
+ }
+
+ {
+ QList<QByteArray> dpNames = qobject->dynamicPropertyNames();
+ for (int i = 0; i < dpNames.size(); ++i) {
+ QString name = QString::fromLatin1(dpNames.at(i));
+ propertyNames.add(JSC::Identifier(exec, qtStringToJSCUString(name)));
+ }
+ }
+
+ {
+ int i = (opt & QScriptEngine::ExcludeSuperClassMethods)
+ ? meta->methodOffset() : 0;
+ for ( ; i < meta->methodCount(); ++i) {
+ QMetaMethod method = meta->method(i);
+ if (hasMethodAccess(method, i, opt)) {
+ QMetaMethod method = meta->method(i);
+ QString name = QString::fromLatin1(methodName(method));
+ propertyNames.add(JSC::Identifier(exec, qtStringToJSCUString(name)));
+ QString sig = QString::fromLatin1(method.signature());
+ propertyNames.add(JSC::Identifier(exec, qtStringToJSCUString(sig)));
+ }
+ }
+ }
+
+ JSC::JSObject::getPropertyNames(exec, propertyNames);
+}
+
+static JSC::JSValue JSC_HOST_CALL qobjectProtoFuncToString(JSC::ExecState *exec, JSC::JSObject*,
+ JSC::JSValue thisValue, const JSC::ArgList&)
+{
+ if (!thisValue.isObject(&QObjectWrapperObject::info))
+ return throwError(exec, JSC::TypeError);
+ QObject *obj = static_cast<QObjectWrapperObject*>(JSC::asObject(thisValue))->value();
+ const QMetaObject *meta = obj ? obj->metaObject() : &QObject::staticMetaObject;
+ QString name = obj ? obj->objectName() : QString::fromUtf8("unnamed");
+ QString str = QString::fromUtf8("%0(name = \"%1\")")
+ .arg(QLatin1String(meta->className())).arg(name);
+ return JSC::jsString(exec, qtStringToJSCUString(str));
+}
+
+QObjectPrototype::QObjectPrototype(JSC::ExecState* exec, WTF::PassRefPtr<JSC::Structure> structure,
+ JSC::Structure* prototypeFunctionStructure)
+ : QObjectWrapperObject(new QObject(), QScriptEngine::AutoOwnership, /*options=*/0, structure)
+{
+ putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, /*length=*/0, exec->propertyNames().toString, qobjectProtoFuncToString), JSC::DontEnum);
+ // ### findChild(), findChildren()
+}
+
+static const uint qt_meta_data_QObjectConnectionManager[] = {
+
+ // content:
+ 1, // revision
+ 0, // classname
+ 0, 0, // classinfo
+ 1, 10, // methods
+ 0, 0, // properties
+ 0, 0, // enums/sets
+
+ // slots: signature, parameters, type, tag, flags
+ 35, 34, 34, 34, 0x0a,
+
+ 0 // eod
+};
+
+static const char qt_meta_stringdata_QObjectConnectionManager[] = {
+ "QScript::QObjectConnectionManager\0\0execute()\0"
+};
+
+const QMetaObject QObjectConnectionManager::staticMetaObject = {
+ { &QObject::staticMetaObject, qt_meta_stringdata_QObjectConnectionManager,
+ qt_meta_data_QObjectConnectionManager, 0 }
+};
+
+const QMetaObject *QObjectConnectionManager::metaObject() const
+{
+ return &staticMetaObject;
+}
+
+void *QObjectConnectionManager::qt_metacast(const char *_clname)
+{
+ if (!_clname) return 0;
+ if (!strcmp(_clname, qt_meta_stringdata_QObjectConnectionManager))
+ return static_cast<void*>(const_cast<QObjectConnectionManager*>(this));
+ return QObject::qt_metacast(_clname);
+}
+
+int QObjectConnectionManager::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
+{
+ _id = QObject::qt_metacall(_c, _id, _a);
+ if (_id < 0)
+ return _id;
+ if (_c == QMetaObject::InvokeMetaMethod) {
+ execute(_id, _a);
+ _id -= slotCounter;
+ }
+ return _id;
+}
+
+void QObjectConnectionManager::execute(int slotIndex, void **argv)
+{
+ JSC::JSValue receiver;
+ JSC::JSValue slot;
+ JSC::JSValue senderWrapper;
+ int signalIndex = -1;
+ for (int i = 0; i < connections.size(); ++i) {
+ const QVector<QObjectConnection> &cs = connections.at(i);
+ for (int j = 0; j < cs.size(); ++j) {
+ const QObjectConnection &c = cs.at(j);
+ if (c.slotIndex == slotIndex) {
+ receiver = c.receiver;
+ slot = c.slot;
+ senderWrapper = c.senderWrapper;
+ signalIndex = i;
+ break;
+ }
+ }
+ }
+// Q_ASSERT(slot != 0);
+
+#if 0
+ // ### fixme
+ if (engine->isCollecting()) {
+ // we can't do a script function call during GC,
+ // so we're forced to ignore this signal
+ return;
+ }
+
+ QScriptFunction *fun = engine->convertToNativeFunction(slot);
+ if (fun == 0) {
+ // the signal handler has been GC'ed. This can only happen when
+ // a QObject is owned by the engine, the engine is destroyed, and
+ // there is a script function connected to the destroyed() signal
+ Q_ASSERT(signalIndex <= 1); // destroyed(QObject*)
+ return;
+ }
+#endif
+
+ const QMetaObject *meta = sender()->metaObject();
+ const QMetaMethod method = meta->method(signalIndex);
+
+ QList<QByteArray> parameterTypes = method.parameterTypes();
+ int argc = parameterTypes.count();
+
+ JSC::ExecState *exec = engine->globalObject->globalExec();
+ JSC::ArgList jscArgs;
+ for (int i = 0; i < argc; ++i) {
+ int argType = QMetaType::type(parameterTypes.at(i));
+ QScriptValue arg = engine->create(argType, argv[i + 1]);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "implement me");
+#if 0
+ jscArgs.append(engine->scriptValueToJSCValue(arg));
+#endif
+ }
+
+ JSC::JSValue senderObject;
+ if (senderWrapper && senderWrapper.isObject(&QObjectWrapperObject::info))
+ senderObject = senderWrapper;
+ else {
+ QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject;
+ senderObject = engine->newQObject(sender(), QScriptEngine::QtOwnership, opt);
+ }
+
+ JSC::JSValue thisObject;
+ if (receiver && receiver.isObject())
+ thisObject = receiver;
+ else
+ thisObject = exec->dynamicGlobalObject();
+
+ (void)static_cast<JSC::JSFunction*>(JSC::asFunction(slot))->call(exec, thisObject, jscArgs);
+ if (exec->hadException())
+ engine->emitSignalHandlerException();
+}
+
+QObjectConnectionManager::QObjectConnectionManager(QScriptEnginePrivate *eng)
+ : engine(eng), slotCounter(0)
+{
+}
+
+QObjectConnectionManager::~QObjectConnectionManager()
+{
+}
+
+void QObjectConnectionManager::mark()
+{
+ for (int i = 0; i < connections.size(); ++i) {
+ QVector<QObjectConnection> &cs = connections[i];
+ for (int j = 0; j < cs.size(); ++j)
+ cs[j].mark();
+ }
+}
+
+bool QObjectConnectionManager::addSignalHandler(
+ QObject *sender, const char *signal, JSC::JSValue receiver,
+ JSC::JSValue function, JSC::JSValue senderWrapper)
+{
+ Q_ASSERT(sender != 0);
+ Q_ASSERT(signal != 0);
+ Q_ASSERT(function.isObject(&JSC::JSFunction::info));
+ const QMetaObject *meta = sender->metaObject();
+ int signalIndex = meta->indexOfSignal(QMetaObject::normalizedSignature(signal+1));
+ if (signalIndex == -1)
+ return false;
+ if (connections.size() <= signalIndex)
+ connections.resize(signalIndex+1);
+ QVector<QObjectConnection> &cs = connections[signalIndex];
+ int absSlotIndex = slotCounter + metaObject()->methodOffset();
+ bool ok = QMetaObject::connect(sender, signalIndex, this, absSlotIndex);
+ if (ok)
+ cs.append(QObjectConnection(slotCounter++, receiver, function, senderWrapper));
+ return ok;
+}
+
+bool QObjectConnectionManager::removeSignalHandler(
+ QObject *sender, const char *signal,
+ JSC::JSValue receiver, JSC::JSValue slot)
+{
+ Q_ASSERT(sender != 0);
+ Q_ASSERT(signal != 0);
+ const QMetaObject *meta = sender->metaObject();
+ int signalIndex = meta->indexOfSignal(QMetaObject::normalizedSignature(signal+1));
+ if (signalIndex == -1)
+ return false;
+ if (connections.size() <= signalIndex)
+ return false;
+ QVector<QObjectConnection> &cs = connections[signalIndex];
+ for (int i = 0; i < cs.size(); ++i) {
+ const QObjectConnection &c = cs.at(i);
+ if (c.hasTarget(receiver, slot)) {
+ int absSlotIndex = c.slotIndex + metaObject()->methodOffset();
+ bool ok = QMetaObject::disconnect(sender, signalIndex, this, absSlotIndex);
+ if (ok)
+ cs.remove(i);
+ return ok;
+ }
+ }
+ return false;
+}
+
+QObjectData::QObjectData(QScriptEnginePrivate *eng)
+ : engine(eng), connectionManager(0)
+{
+}
+
+QObjectData::~QObjectData()
+{
+ if (connectionManager) {
+ delete connectionManager;
+ connectionManager = 0;
+ }
+}
+
+void QObjectData::mark()
+{
+ if (connectionManager)
+ connectionManager->mark();
+}
+
+bool QObjectData::addSignalHandler(QObject *sender,
+ const char *signal,
+ JSC::JSValue receiver,
+ JSC::JSValue slot,
+ JSC::JSValue senderWrapper)
+{
+ if (!connectionManager)
+ connectionManager = new QObjectConnectionManager(engine);
+ return connectionManager->addSignalHandler(
+ sender, signal, receiver, slot, senderWrapper);
+}
+
+bool QObjectData::removeSignalHandler(QObject *sender,
+ const char *signal,
+ JSC::JSValue receiver,
+ JSC::JSValue slot)
+{
+ if (!connectionManager)
+ return false;
+ return connectionManager->removeSignalHandler(
+ sender, signal, receiver, slot);
+}
+
+} // namespace QScript
+
+namespace JSC
+{
+ ASSERT_CLASS_FITS_IN_CELL(QScript::QtFunction);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
diff --git a/src/script/bridge/qscriptqobject_p.h b/src/script/bridge/qscriptqobject_p.h
new file mode 100644
index 0000000..3c2f2d2
--- /dev/null
+++ b/src/script/bridge/qscriptqobject_p.h
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTQOBJECT_P_H
+#define QSCRIPTQOBJECT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qobject.h>
+
+#ifndef QT_NO_SCRIPT
+
+#include "qscriptengine.h"
+#include <QtCore/qpointer.h>
+
+#include "JSObject.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QScript
+{
+
+class QObjectWrapperObject : public JSC::JSObject
+{
+public:
+ // work around CELL_SIZE limitation
+ struct Data
+ {
+ QPointer<QObject> value;
+ QScriptEngine::ValueOwnership ownership;
+ QScriptEngine::QObjectWrapOptions options;
+
+ Data(QObject *o, QScriptEngine::ValueOwnership own,
+ QScriptEngine::QObjectWrapOptions opt)
+ : value(o), ownership(own), options(opt) {}
+ };
+
+ explicit QObjectWrapperObject(
+ QObject *object, QScriptEngine::ValueOwnership ownership,
+ const QScriptEngine::QObjectWrapOptions &options,
+ WTF::PassRefPtr<JSC::Structure> sid);
+ ~QObjectWrapperObject();
+
+ virtual bool getOwnPropertySlot(JSC::ExecState*,
+ const JSC::Identifier& propertyName,
+ JSC::PropertySlot&);
+ virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
+ JSC::JSValue, JSC::PutPropertySlot&);
+ virtual bool deleteProperty(JSC::ExecState*,
+ const JSC::Identifier& propertyName);
+ virtual void getPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&);
+
+ virtual const JSC::ClassInfo* classInfo() const { return &info; }
+ static const JSC::ClassInfo info;
+
+ inline QObject *value() const { return data->value; }
+ inline void setValue(QObject* value) { data->value = value; }
+
+ inline QScriptEngine::ValueOwnership ownership() const
+ { return data->ownership; }
+ inline void setOwnership(QScriptEngine::ValueOwnership ownership)
+ { data->ownership = ownership; }
+
+ inline QScriptEngine::QObjectWrapOptions options() const
+ { return data->options; }
+ inline void setOptions(QScriptEngine::QObjectWrapOptions options)
+ { data->options = options; }
+
+ static WTF::PassRefPtr<JSC::Structure> createStructureID(JSC::JSValue prototype)
+ {
+ return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType));
+ }
+
+protected:
+ Data *data;
+};
+
+class QObjectPrototype : public QObjectWrapperObject
+{
+public:
+ QObjectPrototype(JSC::ExecState*, WTF::PassRefPtr<JSC::Structure>,
+ JSC::Structure* prototypeFunctionStructure);
+};
+
+class QObjectConnectionManager;
+
+class QObjectData // : public QObjectUserData
+{
+public:
+ QObjectData(QScriptEnginePrivate *engine);
+ ~QObjectData();
+
+ bool addSignalHandler(QObject *sender,
+ const char *signal,
+ JSC::JSValue receiver,
+ JSC::JSValue slot,
+ JSC::JSValue senderWrapper = 0);
+ bool removeSignalHandler(QObject *sender,
+ const char *signal,
+ JSC::JSValue receiver,
+ JSC::JSValue slot);
+
+ void mark();
+
+private:
+ QScriptEnginePrivate *engine;
+ QScript::QObjectConnectionManager *connectionManager;
+// QList<QScriptQObjectWrapperInfo> wrappers;
+};
+
+} // namespace QScript
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/bridge/qscriptvariant.cpp b/src/script/bridge/qscriptvariant.cpp
new file mode 100644
index 0000000..0255961
--- /dev/null
+++ b/src/script/bridge/qscriptvariant.cpp
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#include "qscriptvariant_p.h"
+
+#ifndef QT_NO_SCRIPT
+
+#include "Error.h"
+#include "PrototypeFunction.h"
+#include "JSString.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace JSC
+{
+ASSERT_CLASS_FITS_IN_CELL(QScript::QVariantWrapperObject);
+ASSERT_CLASS_FITS_IN_CELL(QScript::QVariantPrototype);
+}
+
+namespace QScript
+{
+
+JSC::UString qtStringToJSCUString(const QString &str);
+
+const JSC::ClassInfo QVariantWrapperObject::info = { "QVariant", 0, 0, 0 };
+
+QVariantWrapperObject::QVariantWrapperObject(WTF::PassRefPtr<JSC::Structure> sid)
+ : JSC::JSObject(sid), data(new Data())
+{
+}
+
+QVariantWrapperObject::~QVariantWrapperObject()
+{
+ delete data;
+}
+
+static JSC::JSValue JSC_HOST_CALL variantProtoFuncToString(JSC::ExecState *exec, JSC::JSObject*,
+ JSC::JSValue thisValue, const JSC::ArgList&)
+{
+ if (!thisValue.isObject(&QVariantWrapperObject::info))
+ return throwError(exec, JSC::TypeError);
+ const QVariant &v = static_cast<QVariantWrapperObject*>(JSC::asObject(thisValue))->value();
+ // ### check the type
+ return JSC::jsString(exec, QScript::qtStringToJSCUString(v.toString()));
+}
+
+static JSC::JSValue JSC_HOST_CALL variantProtoFuncValueOf(JSC::ExecState *exec, JSC::JSObject*,
+ JSC::JSValue thisValue, const JSC::ArgList&)
+{
+ if (!thisValue.isObject(&QVariantWrapperObject::info))
+ return throwError(exec, JSC::TypeError);
+ const QVariant &v = static_cast<QVariantWrapperObject*>(JSC::asObject(thisValue))->value();
+ switch (v.type()) {
+ case QVariant::Invalid:
+ return JSC::jsUndefined();
+
+ case QVariant::String:
+ return JSC::jsString(exec, QScript::qtStringToJSCUString(v.toString()));
+
+ case QVariant::Int:
+ return JSC::jsNumber(exec, v.toInt());
+
+ case QVariant::Bool:
+ return JSC::jsBoolean(v.toBool());
+
+ case QVariant::Double:
+ return JSC::jsNumber(exec, v.toDouble());
+
+// case QVariant::Char:
+// return JSC::jsNumber(exec, v.toChar().unicode());
+
+ case QVariant::UInt:
+ return JSC::jsNumber(exec, v.toUInt());
+ default:
+ ;
+ }
+ return thisValue;
+}
+
+QVariantPrototype::QVariantPrototype(JSC::ExecState* exec, WTF::PassRefPtr<JSC::Structure> structure,
+ JSC::Structure* prototypeFunctionStructure)
+ : QVariantWrapperObject(structure)
+{
+ setValue(QVariant());
+
+ putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, 0, exec->propertyNames().toString, variantProtoFuncToString), JSC::DontEnum);
+ putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, 0, exec->propertyNames().valueOf, variantProtoFuncValueOf), JSC::DontEnum);
+}
+
+} // namespace QScript
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
diff --git a/src/script/bridge/qscriptvariant_p.h b/src/script/bridge/qscriptvariant_p.h
new file mode 100644
index 0000000..da0bb26
--- /dev/null
+++ b/src/script/bridge/qscriptvariant_p.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTVARIANT_P_H
+#define QSCRIPTVARIANT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qvariant.h>
+
+#ifndef QT_NO_SCRIPT
+
+#include "JSObject.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QScript
+{
+
+class QVariantWrapperObject : public JSC::JSObject
+{
+public:
+ // work around CELL_SIZE limitation
+ struct Data
+ {
+ QVariant value;
+ };
+
+ explicit QVariantWrapperObject(WTF::PassRefPtr<JSC::Structure> sid);
+ ~QVariantWrapperObject();
+
+ virtual const JSC::ClassInfo* classInfo() const { return &info; }
+ static const JSC::ClassInfo info;
+
+ inline const QVariant &value() const { return data->value; }
+ inline void setValue(const QVariant &value) { data->value = value; }
+
+private:
+ Data *data;
+};
+
+class QVariantPrototype : public QVariantWrapperObject
+{
+public:
+ QVariantPrototype(JSC::ExecState*, WTF::PassRefPtr<JSC::Structure>,
+ JSC::Structure* prototypeFunctionStructure);
+};
+
+} // namespace QScript
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/instruction.table b/src/script/instruction.table
deleted file mode 100644
index 389db18..0000000
--- a/src/script/instruction.table
+++ /dev/null
@@ -1,87 +0,0 @@
-Q_SCRIPT_DEFINE_OPERATOR(Add)
-Q_SCRIPT_DEFINE_OPERATOR(Assign)
-Q_SCRIPT_DEFINE_OPERATOR(BitAnd)
-Q_SCRIPT_DEFINE_OPERATOR(BitOr)
-Q_SCRIPT_DEFINE_OPERATOR(BitXor)
-Q_SCRIPT_DEFINE_OPERATOR(BitNot)
-Q_SCRIPT_DEFINE_OPERATOR(Branch)
-Q_SCRIPT_DEFINE_OPERATOR(BranchTrue)
-Q_SCRIPT_DEFINE_OPERATOR(BranchFalse)
-Q_SCRIPT_DEFINE_OPERATOR(Call)
-Q_SCRIPT_DEFINE_OPERATOR(DeclareLocal)
-Q_SCRIPT_DEFINE_OPERATOR(Decr)
-Q_SCRIPT_DEFINE_OPERATOR(Delete)
-Q_SCRIPT_DEFINE_OPERATOR(Div)
-Q_SCRIPT_DEFINE_OPERATOR(Duplicate)
-Q_SCRIPT_DEFINE_OPERATOR(EnterWith)
-Q_SCRIPT_DEFINE_OPERATOR(Equal)
-Q_SCRIPT_DEFINE_OPERATOR(Fetch)
-Q_SCRIPT_DEFINE_OPERATOR(FetchField)
-Q_SCRIPT_DEFINE_OPERATOR(LazyArguments)
-Q_SCRIPT_DEFINE_OPERATOR(GreatOrEqual)
-Q_SCRIPT_DEFINE_OPERATOR(GreatThan)
-Q_SCRIPT_DEFINE_OPERATOR(HasNextElement)
-Q_SCRIPT_DEFINE_OPERATOR(In)
-Q_SCRIPT_DEFINE_OPERATOR(Incr)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceAdd)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceAnd)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceDiv)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceLeftShift)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceMod)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceMul)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceOr)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceRightShift)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceSub)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceURightShift)
-Q_SCRIPT_DEFINE_OPERATOR(InstanceOf)
-Q_SCRIPT_DEFINE_OPERATOR(LeaveWith)
-Q_SCRIPT_DEFINE_OPERATOR(LeftShift)
-Q_SCRIPT_DEFINE_OPERATOR(LessOrEqual)
-Q_SCRIPT_DEFINE_OPERATOR(LessThan)
-Q_SCRIPT_DEFINE_OPERATOR(LoadFalse)
-Q_SCRIPT_DEFINE_OPERATOR(LoadString)
-Q_SCRIPT_DEFINE_OPERATOR(LoadNumber)
-Q_SCRIPT_DEFINE_OPERATOR(LoadThis)
-Q_SCRIPT_DEFINE_OPERATOR(LoadActivation)
-Q_SCRIPT_DEFINE_OPERATOR(LoadNull)
-Q_SCRIPT_DEFINE_OPERATOR(LoadTrue)
-Q_SCRIPT_DEFINE_OPERATOR(LoadUndefined)
-Q_SCRIPT_DEFINE_OPERATOR(Mod)
-Q_SCRIPT_DEFINE_OPERATOR(Mul)
-Q_SCRIPT_DEFINE_OPERATOR(New)
-Q_SCRIPT_DEFINE_OPERATOR(NewArray)
-Q_SCRIPT_DEFINE_OPERATOR(NewClosure)
-Q_SCRIPT_DEFINE_OPERATOR(NewEnumeration)
-Q_SCRIPT_DEFINE_OPERATOR(NewObject)
-Q_SCRIPT_DEFINE_OPERATOR(NewRegExp)
-Q_SCRIPT_DEFINE_OPERATOR(NextElement)
-Q_SCRIPT_DEFINE_OPERATOR(Nop)
-Q_SCRIPT_DEFINE_OPERATOR(Not)
-Q_SCRIPT_DEFINE_OPERATOR(NotEqual)
-Q_SCRIPT_DEFINE_OPERATOR(Pop)
-Q_SCRIPT_DEFINE_OPERATOR(PostDecr)
-Q_SCRIPT_DEFINE_OPERATOR(PostIncr)
-Q_SCRIPT_DEFINE_OPERATOR(PutField)
-Q_SCRIPT_DEFINE_OPERATOR(Receive)
-Q_SCRIPT_DEFINE_OPERATOR(Resolve)
-Q_SCRIPT_DEFINE_OPERATOR(Ret)
-Q_SCRIPT_DEFINE_OPERATOR(RightShift)
-Q_SCRIPT_DEFINE_OPERATOR(StrictEqual)
-Q_SCRIPT_DEFINE_OPERATOR(StrictNotEqual)
-Q_SCRIPT_DEFINE_OPERATOR(Sub)
-Q_SCRIPT_DEFINE_OPERATOR(Swap)
-Q_SCRIPT_DEFINE_OPERATOR(ToFirstElement)
-Q_SCRIPT_DEFINE_OPERATOR(Throw)
-Q_SCRIPT_DEFINE_OPERATOR(TypeOf)
-Q_SCRIPT_DEFINE_OPERATOR(UnaryMinus)
-Q_SCRIPT_DEFINE_OPERATOR(UnaryPlus)
-Q_SCRIPT_DEFINE_OPERATOR(URightShift)
-Q_SCRIPT_DEFINE_OPERATOR(InplaceXor)
-Q_SCRIPT_DEFINE_OPERATOR(Line)
-Q_SCRIPT_DEFINE_OPERATOR(Sync)
-Q_SCRIPT_DEFINE_OPERATOR(Halt)
-Q_SCRIPT_DEFINE_OPERATOR(BeginCatch)
-Q_SCRIPT_DEFINE_OPERATOR(EndCatch)
-Q_SCRIPT_DEFINE_OPERATOR(MakeReference)
-Q_SCRIPT_DEFINE_OPERATOR(NewString)
-Q_SCRIPT_DEFINE_OPERATOR(Debugger)
diff --git a/src/script/parser/parser.pri b/src/script/parser/parser.pri
new file mode 100644
index 0000000..7f2e30a
--- /dev/null
+++ b/src/script/parser/parser.pri
@@ -0,0 +1,16 @@
+SOURCES += \
+ $$PWD/qscriptast.cpp \
+ $$PWD/qscriptastvisitor.cpp \
+ $$PWD/qscriptgrammar.cpp \
+# $$PWD/qscriptlexer.cpp \
+# $$PWD/qscriptparser.cpp \
+# $$PWD/qscriptsyntaxchecker.cpp
+
+HEADERS += \
+ $$PWD/qscriptastfwd_p.h \
+ $$PWD/qscriptast_p.h \
+ $$PWD/qscriptastvisitor_p.h \
+ $$PWD/qscriptgrammar_p.h \
+# $$PWD/qscriptlexer_p.h \
+# $$PWD/qscriptparser_p.h \
+# $$PWD/qscriptsyntaxchecker_p.h
diff --git a/src/script/qscript.g b/src/script/parser/qscript.g
index 8bf0ce6..c8a0fdd 100644
--- a/src/script/qscript.g
+++ b/src/script/parser/qscript.g
@@ -1,41 +1,11 @@
----------------------------------------------------------------------------
--
--- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+-- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
-- Contact: Qt Software Information (qt-info@nokia.com)
--
--- This file is part of the QtScript module of the Qt Toolkit.
+-- This file is part of the $MODULE$ of the Qt Toolkit.
--
--- $QT_BEGIN_LICENSE:LGPL$
--- No Commercial Usage
--- This file contains pre-release code and may not be distributed.
--- You may use this file in accordance with the terms and conditions
--- contained in the either Technology Preview License Agreement or the
--- Beta Release License Agreement.
---
--- GNU Lesser General Public License Usage
--- Alternatively, this file may be used under the terms of the GNU Lesser
--- General Public License version 2.1 as published by the Free Software
--- Foundation and appearing in the file LICENSE.LGPL included in the
--- packaging of this file. Please review the following information to
--- ensure the GNU Lesser General Public License version 2.1 requirements
--- will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
---
--- In addition, as a special exception, Nokia gives you certain
--- additional rights. These rights are described in the Nokia Qt LGPL
--- Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
--- package.
---
--- GNU General Public License Usage
--- Alternatively, this file may be used under the terms of the GNU
--- General Public License version 3.0 as published by the Free Software
--- Foundation and appearing in the file LICENSE.GPL included in the
--- packaging of this file. Please review the following information to
--- ensure the GNU General Public License version 3.0 requirements will be
--- met: http://www.gnu.org/copyleft/gpl.html.
---
--- If you are unsure which license is appropriate for your use, please
--- contact the sales department at qt-sales@nokia.com.
--- $QT_END_LICENSE$
+-- $TROLLTECH_DUAL_LICENSE$
--
-- This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-- WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
@@ -84,42 +54,12 @@
/.
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -151,42 +91,12 @@
/:
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -331,9 +241,7 @@ QScriptParser::QScriptParser():
stack_size(0),
sym_stack(0),
state_stack(0),
- location_stack(0),
- error_lineno(0),
- error_column(0)
+ location_stack(0)
{
}
diff --git a/src/script/qscriptast.cpp b/src/script/parser/qscriptast.cpp
index defbd28..e2f9606 100644
--- a/src/script/qscriptast.cpp
+++ b/src/script/parser/qscriptast.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptast_p.h b/src/script/parser/qscriptast_p.h
index 3d3128a..a33e16b 100644
--- a/src/script/qscriptast_p.h
+++ b/src/script/parser/qscriptast_p.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptastfwd_p.h b/src/script/parser/qscriptastfwd_p.h
index 192ede1..3bfd5e5 100644
--- a/src/script/qscriptastfwd_p.h
+++ b/src/script/parser/qscriptastfwd_p.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/parser/qscriptastvisitor.cpp b/src/script/parser/qscriptastvisitor.cpp
new file mode 100644
index 0000000..c4f6e0b
--- /dev/null
+++ b/src/script/parser/qscriptastvisitor.cpp
@@ -0,0 +1,28 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#include "qscriptastvisitor_p.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QScript { namespace AST {
+
+Visitor::Visitor()
+{
+}
+
+Visitor::~Visitor()
+{
+}
+
+} } // namespace QScript::AST
+
+QT_END_NAMESPACE
diff --git a/src/script/qscriptastvisitor_p.h b/src/script/parser/qscriptastvisitor_p.h
index de5528c..b44d9a8 100644
--- a/src/script/qscriptastvisitor_p.h
+++ b/src/script/parser/qscriptastvisitor_p.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptgrammar.cpp b/src/script/parser/qscriptgrammar.cpp
index 8b8a05d..b117af4 100644
--- a/src/script/qscriptgrammar.cpp
+++ b/src/script/parser/qscriptgrammar.cpp
@@ -1,42 +1,12 @@
// This file was generated by qlalr - DO NOT EDIT!
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptgrammar_p.h b/src/script/parser/qscriptgrammar_p.h
index 90c11fd..803ecca 100644
--- a/src/script/qscriptgrammar_p.h
+++ b/src/script/parser/qscriptgrammar_p.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptlexer.cpp b/src/script/parser/qscriptlexer.cpp
index f93b905..810eb90 100644
--- a/src/script/qscriptlexer.cpp
+++ b/src/script/parser/qscriptlexer.cpp
@@ -1,59 +1,19 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "qscriptengine_p.h"
+#include "qscriptlexer_p.h"
#ifndef QT_NO_SCRIPT
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptlexer_p.h"
#include "qscriptgrammar_p.h"
-
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
@@ -72,6 +32,8 @@ extern double qstrtod(const char *s00, char const **se, bool *ok);
} \
while (0)
+typedef double qsreal; // ###
+
namespace QScript {
extern qsreal integerFromString(const char *buf, int size, int radix);
}
@@ -79,25 +41,14 @@ extern qsreal integerFromString(const char *buf, int size, int radix);
QScript::Lexer::Lexer(QScriptEnginePrivate *eng)
: driver(eng),
yylineno(0),
- done(false),
- size8(128), size16(128),
- pos8(0), pos16(0),
- terminator(false),
- restrKeyword(false),
- delimited(false),
- stackToken(-1),
- state(Start),
- pos(0),
+ size8(128), size16(128), restrKeyword(false),
+ stackToken(-1), pos(0),
code(0), length(0),
- yycolumn(0),
- startlineno(0), startcolumn(0),
bol(true),
current(0), next1(0), next2(0), next3(0),
err(NoError),
- wantRx(false),
check_reserved(true),
parenthesesState(IgnoreParentheses),
- parenthesesCount(0),
prohibitAutomaticSemicolon(false)
{
// allocate space for read buffers
@@ -790,9 +741,10 @@ int QScript::Lexer::lex()
case Identifier:
if ((token = findReservedWord(buffer16, pos16)) < 0) {
/* TODO: close leak on parse error. same holds true for String */
- if (driver)
- qsyylval.ustr = driver->intern(buffer16, pos16);
- else
+ if (driver) {
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ qsyylval.ustr = 0; // driver->intern(buffer16, pos16);
+ } else
qsyylval.ustr = 0;
return QScriptGrammar::T_IDENTIFIER;
}
@@ -808,9 +760,10 @@ int QScript::Lexer::lex()
}
return token;
case String:
- if (driver)
- qsyylval.ustr = driver->intern(buffer16, pos16);
- else
+ if (driver) {
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ qsyylval.ustr = 0; // driver->intern(buffer16, pos16);
+ } else
qsyylval.ustr = 0;
return QScriptGrammar::T_STRING_LITERAL;
case Number:
@@ -1077,9 +1030,10 @@ bool QScript::Lexer::scanRegExp(RegExpBodyPrefix prefix)
lastWasEscape = !lastWasEscape && (current == '\\');
}
else {
- if (driver)
- pattern = driver->intern(buffer16, pos16);
- else
+ if (driver) {
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ pattern = 0; // driver->intern(buffer16, pos16);
+ } else
pattern = 0;
pos16 = 0;
shift(1);
@@ -1090,7 +1044,8 @@ bool QScript::Lexer::scanRegExp(RegExpBodyPrefix prefix)
flags = 0;
while (isIdentLetter(current)) {
- int flag = QScript::Ecma::RegExp::flagFromChar(current);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ int flag = 0; // QScript::Ecma::RegExp::flagFromChar(current);
if (flag == 0) {
errmsg = QString::fromLatin1("Invalid regular expression flag '%0'")
.arg(QChar(current));
diff --git a/src/script/qscriptlexer_p.h b/src/script/parser/qscriptlexer_p.h
index acf242c..8e56049 100644
--- a/src/script/qscriptlexer_p.h
+++ b/src/script/parser/qscriptlexer_p.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptparser.cpp b/src/script/parser/qscriptparser.cpp
index 7408ec5..9e25c77 100644
--- a/src/script/qscriptparser.cpp
+++ b/src/script/parser/qscriptparser.cpp
@@ -2,42 +2,12 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -47,15 +17,7 @@
#include <string.h>
-#include "qscriptengine.h"
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptlexer_p.h"
#include "qscriptast_p.h"
-#include "qscriptnodepool_p.h"
#define Q_SCRIPT_UPDATE_POSITION(node, startloc, endloc) do { \
node->startLine = startloc.startLine; \
@@ -88,9 +50,7 @@ QScriptParser::QScriptParser():
stack_size(0),
sym_stack(0),
state_stack(0),
- location_stack(0),
- error_lineno(0),
- error_column(0)
+ location_stack(0)
{
}
diff --git a/src/script/qscriptparser_p.h b/src/script/parser/qscriptparser_p.h
index 98317c7..338e2d6 100644
--- a/src/script/qscriptparser_p.h
+++ b/src/script/parser/qscriptparser_p.h
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/qscriptsyntaxchecker.cpp b/src/script/parser/qscriptsyntaxchecker.cpp
index 74ca00f..5883c69 100644
--- a/src/script/qscriptsyntaxchecker.cpp
+++ b/src/script/parser/qscriptsyntaxchecker.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
diff --git a/src/script/parser/qscriptsyntaxchecker_p.h b/src/script/parser/qscriptsyntaxchecker_p.h
new file mode 100644
index 0000000..85e3496
--- /dev/null
+++ b/src/script/parser/qscriptsyntaxchecker_p.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTSYNTAXCHECKER_H
+#define QSCRIPTSYNTAXCHECKER_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qstring.h>
+
+#ifndef QT_NO_SCRIPT
+
+#include "qscriptgrammar_p.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QScript {
+
+class Lexer;
+
+class SyntaxChecker: protected QScriptGrammar
+{
+public:
+ enum State {
+ Error,
+ Intermediate,
+ Valid,
+ };
+
+ struct Result {
+ Result(State s, int ln, int col, const QString &msg)
+ : state(s), errorLineNumber(ln), errorColumnNumber(col),
+ errorMessage(msg) {}
+ State state;
+ int errorLineNumber;
+ int errorColumnNumber;
+ QString errorMessage;
+ };
+
+ SyntaxChecker();
+ ~SyntaxChecker();
+
+ Result checkSyntax(const QString &code);
+
+protected:
+ bool automatic(QScript::Lexer *lexer, int token) const;
+ inline void reallocateStack();
+
+protected:
+ int tos;
+ int stack_size;
+ int *state_stack;
+};
+
+inline void SyntaxChecker::reallocateStack()
+{
+ if (! stack_size)
+ stack_size = 128;
+ else
+ stack_size <<= 1;
+
+ state_stack = reinterpret_cast<int*> (qRealloc(state_stack, stack_size * sizeof(int)));
+}
+
+} // namespace QScript
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/qscriptable.h b/src/script/qscriptable.h
deleted file mode 100644
index f990db2..0000000
--- a/src/script/qscriptable.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTABLE_H
-#define QSCRIPTABLE_H
-
-#include <QtCore/qobjectdefs.h>
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Script)
-
-#ifndef QT_NO_QOBJECT
-
-class QScriptEngine;
-class QScriptContext;
-class QScriptValue;
-
-class QScriptablePrivate;
-
-class Q_SCRIPT_EXPORT QScriptable
-{
-public:
- QScriptable();
- ~QScriptable();
-
- QScriptEngine *engine() const;
- QScriptContext *context() const;
- QScriptValue thisObject() const;
- int argumentCount() const;
- QScriptValue argument(int index) const;
-
-private:
- QScriptablePrivate *d_ptr;
-
- Q_DISABLE_COPY(QScriptable)
- Q_DECLARE_PRIVATE(QScriptable)
-};
-
-#endif // QT_NO_QOBJECT
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTABLE_H
diff --git a/src/script/qscriptable_p.h b/src/script/qscriptable_p.h
deleted file mode 100644
index 2343fc4..0000000
--- a/src/script/qscriptable_p.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTABLE_P_H
-#define QSCRIPTABLE_P_H
-
-#include <QtCore/qobjectdefs.h>
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#if !defined(QT_NO_QOBJECT) && !defined(QT_NO_SCRIPT)
-
-QT_BEGIN_NAMESPACE
-
-class QScriptEngine;
-
-class QScriptablePrivate
-{
- Q_DECLARE_PUBLIC(QScriptable)
-public:
- inline QScriptablePrivate()
- : engine(0)
- { }
-
- static inline QScriptablePrivate *get(QScriptable *q)
- { return q->d_func(); }
-
- QScriptEngine *engine;
-
- QScriptable *q_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_QOBJECT && QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptarray_p.h b/src/script/qscriptarray_p.h
deleted file mode 100644
index 0079b30..0000000
--- a/src/script/qscriptarray_p.h
+++ /dev/null
@@ -1,428 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTARRAY_P_H
-#define QSCRIPTARRAY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/QMap>
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/QVector>
-
-#include "qscriptvalueimplfwd_p.h"
-#include "qscriptenginefwd_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-class Array
-{
-public:
- inline Array(QScriptEnginePrivate *engine);
- inline Array(const Array &other);
- inline ~Array();
-
- inline Array &operator = (const Array &other);
-
- inline bool isEmpty() const;
- inline uint size() const;
- inline uint count() const;
- inline QScriptValueImpl at(uint index) const;
- inline void assign(uint index, const QScriptValueImpl &v);
- inline void clear();
- inline void mark(int generation);
- inline void resize(uint size);
- inline void concat(const Array &other);
- inline QScriptValueImpl pop();
- inline void sort(const QScriptValueImpl &comparefn);
- inline void splice(qsreal start, qsreal deleteCount,
- const QVector<QScriptValueImpl> &items,
- Array &other);
- inline QList<uint> keys() const;
-
-private:
- enum Mode {
- VectorMode,
- MapMode
- };
-
- QScriptEnginePrivate *m_engine;
- Mode m_mode;
- int m_instances;
-
- union {
- QMap<uint, QScriptValueImpl> *to_map;
- QVector<QScriptValueImpl> *to_vector;
- };
-};
-
-class ArrayElementLessThan
-{
-public:
- inline ArrayElementLessThan(const QScriptValueImpl &comparefn)
- : m_comparefn(comparefn) {}
-
- inline bool operator()(const QScriptValueImpl &v1, const QScriptValueImpl &v2) const
- {
- if (!v1.isValid() || v1.isUndefined())
- return false;
- if (!v2.isValid() || v2.isUndefined())
- return true;
- if (!m_comparefn.isUndefined()) {
- ArrayElementLessThan *that = const_cast<ArrayElementLessThan*>(this);
- QScriptValueImpl result = that->m_comparefn.call(QScriptValueImpl(),
- QScriptValueImplList() << v1 << v2);
- return result.toNumber() <= 0;
- }
- return v1.toString() < v2.toString();
- }
-
-private:
- QScriptValueImpl m_comparefn;
-};
-
-} // namespace QScript
-
-inline QScript::Array::Array(QScriptEnginePrivate *engine):
- m_engine(engine),
- m_mode(VectorMode),
- m_instances(0)
-{
- to_vector = new QVector<QScriptValueImpl>();
-}
-
-inline QScript::Array::Array(const Array &other):
- m_engine(other.m_engine),
- m_mode(other.m_mode),
- m_instances(other.m_instances)
-{
- if (m_mode == VectorMode)
- to_vector = new QVector<QScriptValueImpl> (*other.to_vector);
- else
- to_map = new QMap<uint, QScriptValueImpl> (*other.to_map);
-}
-
-inline QScript::Array::~Array()
-{
- if (m_mode == VectorMode)
- delete to_vector;
- else
- delete to_map;
-}
-
-inline QScript::Array &QScript::Array::operator = (const Array &other)
-{
- m_engine = other.m_engine;
- m_instances = other.m_instances;
- if (m_mode != other.m_mode) {
- if (m_mode == VectorMode)
- delete to_vector;
- else
- delete to_map;
- m_mode = other.m_mode;
-
- if (m_mode == VectorMode)
- to_vector = new QVector<QScriptValueImpl> (*other.to_vector);
- else
- to_map = new QMap<uint, QScriptValueImpl> (*other.to_map);
- }
-
- if (m_mode == VectorMode)
- *to_vector = *other.to_vector;
- else
- *to_map = *other.to_map;
-
- return *this;
-}
-
-inline bool QScript::Array::isEmpty() const
-{
- if (m_mode == VectorMode)
- return to_vector->isEmpty();
-
- return to_map->isEmpty();
-}
-
-inline uint QScript::Array::size() const
-{
- if (m_mode == VectorMode)
- return to_vector->size();
-
- if (to_map->isEmpty())
- return 0;
-
- return (--to_map->constEnd()).key();
-}
-
-inline uint QScript::Array::count() const
-{
- return size();
-}
-
-inline QScriptValueImpl QScript::Array::at(uint index) const
-{
- if (m_mode == VectorMode) {
- if (index < uint(to_vector->size()))
- return to_vector->at(index);
- return QScriptValueImpl();
- } else {
- return to_map->value(index, QScriptValueImpl());
- }
-}
-
-inline void QScript::Array::assign(uint index, const QScriptValueImpl &v)
-{
- if (index >= size()) {
- resize(index + 1);
- if (v.isValid() && m_engine)
- m_engine->adjustBytesAllocated(sizeof(QScriptValueImpl) * (size() - index));
- }
-
- const QScriptValueImpl &oldv = at(index);
- if (oldv.isValid() && (oldv.isObject() || oldv.isString()))
- --m_instances;
-
- if (v.isValid() && (v.isObject() || v.isString()))
- ++m_instances;
-
- if (m_mode == VectorMode) {
- to_vector->replace(index, v);
- } else {
- if (!v.isValid())
- to_map->remove(index);
- else
- to_map->insert(index, v);
- }
-}
-
-inline void QScript::Array::clear()
-{
- m_instances = 0;
-
- if (m_mode == VectorMode)
- to_vector->clear();
-
- else
- to_map->clear();
-}
-
-inline void QScript::Array::mark(int generation)
-{
- if (! m_instances)
- return;
-
- if (m_mode == VectorMode) {
- for (int i = 0; i < to_vector->size(); ++i)
- to_vector->at(i).mark(generation);
- } else {
- QMap<uint, QScriptValueImpl>::const_iterator it = to_map->constBegin();
- for (; it != to_map->constEnd(); ++it)
- it.value().mark(generation);
- }
-}
-
-inline void QScript::Array::resize(uint s)
-{
- const uint oldSize = size();
- if (oldSize == s)
- return;
-
- const uint N = 10 * 1024;
-
- if (m_mode == VectorMode) {
- if (s < N) {
- to_vector->resize (s);
- } else {
- // switch to MapMode
- QMap<uint, QScriptValueImpl> *m = new QMap<uint, QScriptValueImpl>();
- for (uint i = 0; i < oldSize; ++i) {
- if (to_vector->at(i).isValid())
- m->insert(i, to_vector->at(i));
- }
- m->insert(s, QScriptValueImpl());
- delete to_vector;
- to_map = m;
- m_mode = MapMode;
- }
- }
-
- else {
- if (s < N) {
- // switch to VectorMode
- QVector<QScriptValueImpl> *v = new QVector<QScriptValueImpl> (s);
- QMap<uint, QScriptValueImpl>::const_iterator it = to_map->constBegin();
- for ( ; (it != to_map->constEnd()) && (it.key() < s); ++it)
- (*v) [it.key()] = it.value();
- delete to_map;
- to_vector = v;
- m_mode = VectorMode;
- } else {
- if (!to_map->isEmpty()) {
- QMap<uint, QScriptValueImpl>::iterator it = --to_map->end();
- if (oldSize > s) {
- // shrink
- while ((it != to_map->end()) && (it.key() >= s)) {
- it = to_map->erase(it);
- --it;
- }
- } else {
- if ((it.key() == oldSize) && !it.value().isValid())
- to_map->erase(it);
- }
- }
- to_map->insert(s, QScriptValueImpl());
- }
- }
-}
-
-inline void QScript::Array::concat(const QScript::Array &other)
-{
- uint k = size();
- resize (k + other.size());
- for (uint i = 0; i < other.size(); ++i) {
- QScriptValueImpl v = other.at(i);
- if (! v.isValid())
- continue;
-
- assign(k + i, v);
- }
-}
-
-inline QScriptValueImpl QScript::Array::pop()
-{
- if (isEmpty())
- return QScriptValueImpl();
-
- QScriptValueImpl v;
-
- if (m_mode == VectorMode)
- v = to_vector->last();
- else
- v = *--to_map->end();
-
- resize(size() - 1);
-
- return v;
-}
-
-inline void QScript::Array::sort(const QScriptValueImpl &comparefn)
-{
- ArrayElementLessThan lessThan(comparefn);
- if (m_mode == VectorMode) {
- qSort(to_vector->begin(), to_vector->end(), lessThan);
- } else {
- QList<uint> keys = to_map->keys();
- QList<QScriptValueImpl> values = to_map->values();
- qStableSort(values.begin(), values.end(), lessThan);
- const uint len = keys.size();
- for (uint i = 0; i < len; ++i)
- to_map->insert(keys.at(i), values.at(i));
- }
-}
-
-inline void QScript::Array::splice(qsreal start, qsreal deleteCount,
- const QVector<QScriptValueImpl> &items,
- Array &other)
-{
- const qsreal len = size();
- if (start < 0)
- start = qMax(len + start, qsreal(0));
- else if (start > len)
- start = len;
- deleteCount = qMax(qMin(deleteCount, len - start), qsreal(0));
-
- const uint st = uint(start);
- const uint dc = uint(deleteCount);
- other.resize(dc);
-
- const uint itemsSize = uint(items.size());
-
- if (m_mode == VectorMode) {
- for (uint i = 0; i < dc; ++i)
- other.assign(i, to_vector->at(st + i));
- if (itemsSize > dc)
- to_vector->insert(st, itemsSize - dc, QScriptValueImpl());
- else if (itemsSize < dc)
- to_vector->remove(st, dc - itemsSize);
- for (uint i = 0; i < itemsSize; ++i)
- to_vector->replace(st + i, items.at(i));
- } else {
- for (uint i = 0; i < dc; ++i)
- other.assign(i, to_map->take(st + i));
- uint del = itemsSize - dc;
- if (del != 0) {
- for (uint i = st; i < uint(len); ++i) {
- if (to_map->contains(i))
- to_map->insert(i + del, to_map->take(i));
- }
- resize(uint(len) + del);
- }
- for (uint i = 0; i < itemsSize; ++i)
- to_map->insert(st + i, items.at(i));
- }
-}
-
-inline QList<uint> QScript::Array::keys() const
-{
- if (m_mode == VectorMode)
- return QList<uint>();
- else
- return to_map->keys();
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif // QSCRIPTARRAY_P_H
diff --git a/src/script/qscriptasm.cpp b/src/script/qscriptasm.cpp
deleted file mode 100644
index d898a38..0000000
--- a/src/script/qscriptasm.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/QTextStream>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptasm_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-QT_BEGIN_NAMESPACE
-
-const char *QScriptInstruction::opcode[] = {
-#define STR(a) #a
-#define Q_SCRIPT_DEFINE_OPERATOR(op) STR(i##op) ,
-#include "instruction.table"
-#undef Q_SCRIPT_DEFINE_OPERATOR
-#undef STR
-};
-
-void QScriptInstruction::print(QTextStream &out) const
-{
- out << opcode[op];
-
- if (! operand[0].isValid())
- return;
-
- out << '(' << operand[0].toString();
-
- if (operand[1].isValid())
- out << ", " << operand[1].toString();
-
- out << ')';
-}
-
-namespace QScript {
-
-Code::Code():
- optimized(false),
- firstInstruction(0),
- lastInstruction(0),
- astPool(0)
-{
-}
-
-Code::~Code()
-{
- delete[] firstInstruction;
-}
-
-void Code::init(const CompilationUnit &compilation, NodePool *pool)
-{
- optimized = false;
- const QVector<QScriptInstruction> ilist = compilation.instructions();
- firstInstruction = new QScriptInstruction[ilist.count()];
- lastInstruction = firstInstruction + ilist.count();
- qCopy(ilist.begin(), ilist.end(), firstInstruction);
- exceptionHandlers = compilation.exceptionHandlers();
- astPool = pool;
-}
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptasm_p.h b/src/script/qscriptasm_p.h
deleted file mode 100644
index 3f0058d..0000000
--- a/src/script/qscriptasm_p.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTASM_P_H
-#define QSCRIPTASM_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/qvector.h>
-
-#include "qscriptvalueimplfwd_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QTextStream;
-
-class QScriptInstruction
-{
-public:
- enum Operator {
-#define Q_SCRIPT_DEFINE_OPERATOR(op) OP_##op,
-#include "instruction.table"
-#undef Q_SCRIPT_DEFINE_OPERATOR
- OP_Dummy
- };
-
-public:
- Operator op;
- QScriptValueImpl operand[2];
-#if defined(Q_SCRIPT_DIRECT_CODE)
- void *code;
-#endif
-
- void print(QTextStream &out) const;
-
- static const char *opcode[];
-};
-
-namespace QScript {
-
-class NodePool;
-
-class ExceptionHandlerDescriptor
-{
-public:
- ExceptionHandlerDescriptor()
- : m_startInstruction(0),
- m_endInstruction(0),
- m_handlerInstruction(0) {}
-
- ExceptionHandlerDescriptor(
- int startInstruction,
- int endInstruction,
- int handlerInstruction)
- : m_startInstruction(startInstruction),
- m_endInstruction(endInstruction),
- m_handlerInstruction(handlerInstruction) {}
-
- inline int startInstruction() const { return m_startInstruction; }
- inline int endInstruction() const { return m_endInstruction; }
- inline int handlerInstruction() const { return m_handlerInstruction; }
-
-private:
- int m_startInstruction;
- int m_endInstruction;
- int m_handlerInstruction;
-};
-
-class CompilationUnit
-{
-public:
- CompilationUnit(): m_valid(true),
- m_errorLineNumber(-1) {}
-
- bool isValid() const { return m_valid; }
-
- void setError(const QString &message, int lineNumber)
- {
- m_errorMessage = message;
- m_errorLineNumber = lineNumber;
- m_valid = false;
- }
-
- QString errorMessage() const
- { return m_errorMessage; }
- int errorLineNumber() const
- { return m_errorLineNumber; }
-
- QVector<QScriptInstruction> instructions() const
- { return m_instructions; }
- void setInstructions(const QVector<QScriptInstruction> &instructions)
- { m_instructions = instructions; }
-
- QVector<ExceptionHandlerDescriptor> exceptionHandlers() const
- { return m_exceptionHandlers; }
- void setExceptionHandlers(const QVector<ExceptionHandlerDescriptor> &exceptionHandlers)
- { m_exceptionHandlers = exceptionHandlers; }
-
-private:
- bool m_valid;
- QString m_errorMessage;
- int m_errorLineNumber;
- QVector<QScriptInstruction> m_instructions;
- QVector<ExceptionHandlerDescriptor> m_exceptionHandlers;
-};
-
-class Code
-{
-public:
- Code();
- ~Code();
-
- void init(const CompilationUnit &compilation, NodePool *astPool);
-
-public: // attributes
- bool optimized;
- QScriptInstruction *firstInstruction;
- QScriptInstruction *lastInstruction;
- QVector<ExceptionHandlerDescriptor> exceptionHandlers;
- NodePool *astPool;
-
-private:
- Q_DISABLE_COPY(Code)
-};
-
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTASM_P_H
diff --git a/src/script/qscriptastvisitor.cpp b/src/script/qscriptastvisitor.cpp
deleted file mode 100644
index 8502bc5..0000000
--- a/src/script/qscriptastvisitor.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptastvisitor_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace AST {
-
-Visitor::Visitor()
-{
-}
-
-Visitor::~Visitor()
-{
-}
-
-} } // namespace QScript::AST
-
-QT_END_NAMESPACE
diff --git a/src/script/qscriptbuffer_p.h b/src/script/qscriptbuffer_p.h
deleted file mode 100644
index 92fe6db..0000000
--- a/src/script/qscriptbuffer_p.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTBUFFER_P_H
-#define QSCRIPTBUFFER_P_H
-
-#include <QtCore/qglobal.h>
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-namespace QScript
-{
- template <typename T> class Buffer
- {
- public:
- typedef T *iterator;
- typedef const T *const_iterator;
-
- Buffer() : m_data(0), m_capacity(0), m_size(0) { }
- ~Buffer() { delete [] m_data; }
-
- inline void reserve(int num);
- inline void reset();
- inline void clear();
- inline void append(const T &t);
-
- inline iterator begin();
- inline iterator end();
-
- inline const_iterator begin() const;
- inline const_iterator end() const;
-
- inline int size() const;
- inline void resize(int s);
-
- inline int capacity() const;
- inline T *data();
- inline const T *constData() const;
-
- inline T &last();
- inline T &takeLast();
-
- inline T &at(int i) { return (*this)[i]; }
- inline const T &at(int i) const { return (*this)[i]; }
-
- inline T &operator[](int i);
- inline const T &operator[](int i) const;
-
- inline bool isEmpty() const;
-
- private:
- T *m_data;
- int m_capacity;
- int m_size;
-
- private:
- Q_DISABLE_COPY(Buffer)
- };
-
-} // namespace QScript
-
-template <typename T> T *QScript::Buffer<T>::data() { return m_data; }
-template <typename T> const T *QScript::Buffer<T>::constData() const { return m_data; }
-template <typename T> void QScript::Buffer<T>::reset() { m_size = 0; }
-template <typename T> int QScript::Buffer<T>::capacity() const { return m_capacity; }
-
-template <typename T> int QScript::Buffer<T>::size() const { return m_size; }
-template <typename T> void QScript::Buffer<T>::resize(int s)
-{
- if (m_capacity < s)
- reserve (s << 1);
-
- m_size = s;
-}
-
-template <typename T> void QScript::Buffer<T>::clear()
-{
- delete [] m_data;
- m_data = 0;
- m_size = 0;
- m_capacity = 0;
-}
-
-template <typename T> void QScript::Buffer<T>::reserve(int x)
-{
- // its an ever expanding buffer so it never gets smaller..
- if (x < m_capacity)
- return;
- m_capacity = x;
- T *new_data = new T[m_capacity];
- for (int i=0; i<m_size; ++i)
- new_data[i] = m_data[i];
- delete [] m_data;
- m_data = new_data;
-}
-
-template <typename T> void QScript::Buffer<T>::append(const T &t)
-{
- if (m_size == m_capacity)
- reserve(m_capacity + 32);
- m_data[m_size++] = t;
-}
-
-template <typename T> T &QScript::Buffer<T>::operator[](int i)
-{
- Q_ASSERT(i >= 0);
- Q_ASSERT(i < m_size);
- return m_data[i];
-}
-
-template <typename T> const T &QScript::Buffer<T>::operator[](int i) const
-{
- Q_ASSERT(i >= 0);
- Q_ASSERT(i < m_size);
- return m_data[i];
-}
-
-template <typename T> bool QScript::Buffer<T>::isEmpty() const
-{
- return m_size == 0;
-}
-
-template <typename T> T &QScript::Buffer<T>::takeLast()
-{
- Q_ASSERT(!isEmpty());
- --m_size;
- return m_data[m_size];
-}
-
-template <typename T> T &QScript::Buffer<T>::last()
-{
- return m_data[m_size - 1];
-}
-
-template <typename T> typename QScript::Buffer<T>::iterator QScript::Buffer<T>::begin()
-{
- return m_data;
-}
-
-template <typename T> typename QScript::Buffer<T>::iterator QScript::Buffer<T>::end()
-{
- return m_data + m_size;
-}
-
-template <typename T> typename QScript::Buffer<T>::const_iterator QScript::Buffer<T>::begin() const
-{
- return m_data;
-}
-
-template <typename T> typename QScript::Buffer<T>::const_iterator QScript::Buffer<T>::end() const
-{
- return m_data + m_size;
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptclass_p.h b/src/script/qscriptclass_p.h
deleted file mode 100644
index 79c1a99..0000000
--- a/src/script/qscriptclass_p.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCLASS_P_H
-#define QSCRIPTCLASS_P_H
-
-#include <QtCore/qobjectdefs.h>
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptEngine;
-class QScriptClassInfo;
-class QScriptFunction;
-
-class QScriptClass;
-class QScriptClassPrivate
-{
- Q_DECLARE_PUBLIC(QScriptClass)
-public:
- QScriptClassPrivate(QScriptClass*);
- virtual ~QScriptClassPrivate();
-
- static QScriptClassPrivate *get(QScriptClass *klass);
-
- QScriptClassInfo *classInfo();
- static QScriptClass *classFromInfo(QScriptClassInfo *info);
-
- QScriptFunction *newFunction();
-
- QScriptEngine *engine;
- QScriptClassInfo *m_classInfo;
-
- QScriptClass *q_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptclassdata.cpp b/src/script/qscriptclassdata.cpp
deleted file mode 100644
index aed6fea..0000000
--- a/src/script/qscriptclassdata.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptclassdata_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-QScriptClassData::QScriptClassData()
-{
-}
-
-QScriptClassData::~QScriptClassData()
-{
-}
-
-void QScriptClassData::mark(const QScriptValueImpl &, int)
-{
-}
-
-bool QScriptClassData:: resolve(const QScriptValueImpl &, QScriptNameIdImpl *,
- QScript::Member *, QScriptValueImpl *,
- QScript::AccessMode)
-{
- return false;
-}
-
-bool QScriptClassData::get(const QScriptValueImpl &, const QScript::Member &,
- QScriptValueImpl *)
-{
- Q_ASSERT_X(false, "QScriptClassData::get()",
- "implement if resolveMember is implemented");
- return false;
-}
-
-bool QScriptClassData::put(QScriptValueImpl *, const QScript::Member &,
- const QScriptValueImpl &)
-{
- Q_ASSERT_X(false, "QScriptClassData::put()",
- "implement if resolveMember is implemented");
- return false;
-}
-
-bool QScriptClassData::removeMember(const QScriptValueImpl &,
- const QScript::Member &)
-{
- return true;
-}
-
-bool QScriptClassData::implementsHasInstance(const QScriptValueImpl &)
-{
- return false;
-}
-
-bool QScriptClassData::hasInstance(const QScriptValueImpl &,
- const QScriptValueImpl &)
-{
- Q_ASSERT_X(false, "QScriptClassData::hasInstance()",
- "implement if implementsHasInstance() returns true");
- return false;
-}
-
-QScriptClassDataIterator *QScriptClassData::newIterator(const QScriptValueImpl &)
-{
- return 0;
-}
-
-QScriptClassDataIterator::QScriptClassDataIterator()
-{
-}
-
-QScriptClassDataIterator::~QScriptClassDataIterator()
-{
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptclassdata_p.h b/src/script/qscriptclassdata_p.h
deleted file mode 100644
index e801ed8..0000000
--- a/src/script/qscriptclassdata_p.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCLASSDATA_P_H
-#define QSCRIPTCLASSDATA_P_H
-
-#include "qscriptglobals_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptValueImpl;
-class QScriptNameIdImpl;
-class QScriptClassDataIterator;
-
-namespace QScript {
- class Member;
-}
-
-class QScriptClassData
-{
-protected:
- QScriptClassData();
-
-public:
- virtual ~QScriptClassData();
-
- virtual void mark(const QScriptValueImpl &object, int generation);
- virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode access);
- virtual bool get(const QScriptValueImpl &obj, const QScript::Member &m,
- QScriptValueImpl *result);
- virtual bool put(QScriptValueImpl *object, const QScript::Member &member,
- const QScriptValueImpl &value);
- virtual bool removeMember(const QScriptValueImpl &object,
- const QScript::Member &member);
- virtual bool implementsHasInstance(const QScriptValueImpl &object);
- virtual bool hasInstance(const QScriptValueImpl &object,
- const QScriptValueImpl &value);
- virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object);
-
-private:
- Q_DISABLE_COPY(QScriptClassData)
-};
-
-class QScriptClassDataIterator
-{
-protected:
- QScriptClassDataIterator();
-
-public:
- virtual ~QScriptClassDataIterator();
-
- virtual bool hasNext() const = 0;
- virtual void next(QScript::Member *member) = 0;
-
- virtual bool hasPrevious() const = 0;
- virtual void previous(QScript::Member *member) = 0;
-
- virtual void toFront() = 0;
- virtual void toBack() = 0;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif // QSCRIPTCLASSDATA_P_H
diff --git a/src/script/qscriptclassinfo_p.h b/src/script/qscriptclassinfo_p.h
deleted file mode 100644
index 8eab8a3..0000000
--- a/src/script/qscriptclassinfo_p.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCLASSINFO_P_H
-#define QSCRIPTCLASSINFO_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptclassdata_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-class QScriptClassInfo
-{
-public:
- enum Type {
- FunctionBased = 0x40000000,
-
- ObjectType = 1,
- FunctionType = 2 | FunctionBased,
- ArrayType = 3,
- StringType = 4,
- BooleanType = 5,
- NumberType = 6,
- DateType = 7,
- RegExpType = 8,
- ErrorType = 9,
-
- VariantType = 10,
- QObjectType = 11,
- QMetaObjectType = 12 | FunctionBased,
-
- // Types used by the runtime
- ActivationType = 100,
- EnumerationType = 101,
-
- CustomType = 1000,
-
- TypeMask = 0x0000FFFF
- };
-
- inline QScriptClassInfo(QScriptEnginePrivate *engine, Type type, const QString &name)
- : m_engine(engine), m_type(type), m_name(name), m_data(0) { }
- inline ~QScriptClassInfo() { delete m_data; }
-
- inline QScriptEnginePrivate *engine() const
- { return m_engine; }
- inline Type type() const
- { return m_type; }
- inline QString name() const
- { return m_name; }
-
- inline void setData(QScriptClassData *data)
- { m_data = data; }
- QScriptClassData *data() const
- { return m_data; }
-
-private:
- QScriptEnginePrivate *m_engine;
- Type m_type;
- QString m_name;
- QScriptClassData *m_data;
-
-private:
- Q_DISABLE_COPY(QScriptClassInfo)
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTCLASSINFO_P_H
diff --git a/src/script/qscriptclasspropertyiterator.h b/src/script/qscriptclasspropertyiterator.h
deleted file mode 100644
index 2041a65..0000000
--- a/src/script/qscriptclasspropertyiterator.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCLASSPROPERTYITERATOR_H
-#define QSCRIPTCLASSPROPERTYITERATOR_H
-
-#include <QtCore/qstring.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtScript/qscriptvalue.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Script)
-
-class QScriptClassPropertyIteratorPrivate;
-class Q_SCRIPT_EXPORT QScriptClassPropertyIterator
-{
-protected:
- QScriptClassPropertyIterator(const QScriptValue &object);
-
-public:
- virtual ~QScriptClassPropertyIterator();
-
- QScriptValue object() const;
-
- virtual bool hasNext() const = 0;
- virtual void next() = 0;
-
- virtual bool hasPrevious() const = 0;
- virtual void previous() = 0;
-
- virtual void toFront() = 0;
- virtual void toBack() = 0;
-
- virtual QScriptString name() const = 0;
- virtual uint id() const;
- virtual QScriptValue::PropertyFlags flags() const;
-
-protected:
- QScriptClassPropertyIterator(const QScriptValue &object, QScriptClassPropertyIteratorPrivate &dd);
- QScriptClassPropertyIteratorPrivate *d_ptr;
-
-private:
- Q_DECLARE_PRIVATE(QScriptClassPropertyIterator)
- Q_DISABLE_COPY(QScriptClassPropertyIterator)
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptclasspropertyiterator_p.h b/src/script/qscriptclasspropertyiterator_p.h
deleted file mode 100644
index b1d7467..0000000
--- a/src/script/qscriptclasspropertyiterator_p.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCLASSPROPERTYITERATOR_P_H
-#define QSCRIPTCLASSPROPERTYITERATOR_P_H
-
-#include <QtCore/qobjectdefs.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptvalue.h"
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptClassPropertyIterator;
-class QScriptClassPropertyIteratorPrivate
-{
- Q_DECLARE_PUBLIC(QScriptClassPropertyIterator)
-public:
- QScriptClassPropertyIteratorPrivate(QScriptClassPropertyIterator*);
- virtual ~QScriptClassPropertyIteratorPrivate();
-
- QScriptValue object;
-
- QScriptClassPropertyIterator *q_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptcompiler.cpp b/src/script/qscriptcompiler.cpp
deleted file mode 100644
index 157e466..0000000
--- a/src/script/qscriptcompiler.cpp
+++ /dev/null
@@ -1,2111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptcompiler_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptast_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QtDebug>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-class Compare : protected AST::Visitor
-{
-public:
- bool operator()(AST::ExpressionNode *e1, AST::ExpressionNode *e2)
- {
- if (!e1 || !e2)
- return (e1 == e2);
-
- if (e1->kind != e2->kind)
- return false;
-
- m_e2 = e2;
- m_equal = false;
- e1->accept(this);
- return m_equal;
- }
-
-protected:
- virtual bool visit(AST::ThisExpression *)
- {
- m_equal = true;
- return false;
- }
- virtual bool visit(AST::NullExpression *)
- {
- m_equal = true;
- return false;
- }
- virtual bool visit(AST::VoidExpression *)
- {
- m_equal = true;
- return false;
- }
- virtual bool visit(AST::FalseLiteral *)
- {
- m_equal = true;
- return false;
- }
- virtual bool visit(AST::TrueLiteral *)
- {
- m_equal = true;
- return false;
- }
- virtual bool visit(AST::NumericLiteral *e1)
- {
- AST::NumericLiteral *e2 = static_cast<AST::NumericLiteral*>(m_e2);
- m_equal = (e1->value == e2->value);
- return false;
- }
- virtual bool visit(AST::RegExpLiteral *e1)
- {
- AST::RegExpLiteral *e2 = static_cast<AST::RegExpLiteral*>(m_e2);
- m_equal = (e1->pattern == e2->pattern)
- && (e1->flags == e2->flags);
- return false;
- }
- virtual bool visit(AST::StringLiteral *e1)
- {
- AST::StringLiteral *e2 = static_cast<AST::StringLiteral*>(m_e2);
- m_equal = (e1->value == e2->value);
- return false;
- }
- virtual bool visit(AST::IdentifierExpression *e1)
- {
- AST::IdentifierExpression *e2 = static_cast<AST::IdentifierExpression*>(m_e2);
- m_equal = (e1->name == e2->name);
- return false;
- }
- virtual bool visit(AST::ArrayMemberExpression *e1)
- {
- AST::ArrayMemberExpression *e2 = static_cast<AST::ArrayMemberExpression*>(m_e2);
- m_equal = operator()(e1->base, e2->base)
- && operator()(e1->expression, e2->expression);
- return false;
- }
- virtual bool visit(AST::FieldMemberExpression *e1)
- {
- AST::FieldMemberExpression *e2 = static_cast<AST::FieldMemberExpression*>(m_e2);
- m_equal = (e1->name == e2->name) && operator()(e1->base, e2->base);
- return false;
- }
- virtual bool visit(AST::BinaryExpression *e1)
- {
- AST::BinaryExpression *e2 = static_cast<AST::BinaryExpression*>(m_e2);
- m_equal = (e1->op == e2->op) && operator()(e1->left, e2->left)
- && operator()(e1->right, e2->right);
- return false;
- }
- virtual bool visit(AST::ConditionalExpression *e1)
- {
- AST::ConditionalExpression *e2 = static_cast<AST::ConditionalExpression*>(m_e2);
- m_equal = operator()(e1->expression, e2->expression)
- && operator()(e1->ok, e2->ok)
- && operator()(e1->ko, e2->ko);
- return false;
- }
- virtual bool visit(AST::TypeOfExpression *e1)
- {
- AST::TypeOfExpression *e2 = static_cast<AST::TypeOfExpression*>(m_e2);
- m_equal = operator()(e1->expression, e2->expression);
- return false;
- }
- virtual bool visit(AST::UnaryPlusExpression *e1)
- {
- AST::UnaryPlusExpression *e2 = static_cast<AST::UnaryPlusExpression*>(m_e2);
- m_equal = operator()(e1->expression, e2->expression);
- return false;
- }
- virtual bool visit(AST::UnaryMinusExpression *e1)
- {
- AST::UnaryMinusExpression *e2 = static_cast<AST::UnaryMinusExpression*>(m_e2);
- m_equal = operator()(e1->expression, e2->expression);
- return false;
- }
- virtual bool visit(AST::TildeExpression *e1)
- {
- AST::TildeExpression *e2 = static_cast<AST::TildeExpression*>(m_e2);
- m_equal = operator()(e1->expression, e2->expression);
- return false;
- }
- virtual bool visit(AST::NotExpression *e1)
- {
- AST::NotExpression *e2 = static_cast<AST::NotExpression*>(m_e2);
- m_equal = operator()(e1->expression, e2->expression);
- return false;
- }
- virtual bool visit(AST::Expression *)
- { return false; }
- virtual bool visit(AST::ArrayLiteral *)
- { return false; }
- virtual bool visit(AST::ObjectLiteral *)
- { return false; }
- virtual bool visit(AST::CallExpression *)
- { return false; }
- virtual bool visit(AST::DeleteExpression *)
- { return false; }
- virtual bool visit(AST::FunctionExpression *)
- { return false; }
- virtual bool visit(AST::NewExpression *)
- { return false; }
- virtual bool visit(AST::NewMemberExpression *)
- { return false; }
- virtual bool visit(AST::PostDecrementExpression *)
- { return false; }
- virtual bool visit(AST::PostIncrementExpression *)
- { return false; }
- virtual bool visit(AST::PreDecrementExpression *)
- { return false; }
- virtual bool visit(AST::PreIncrementExpression *)
- { return false; }
-
-private:
- AST::ExpressionNode *m_e2;
- bool m_equal;
-};
-
-class FetchName: protected AST::Visitor
-{
-public:
- inline FetchName(QScriptEnginePrivate *e):
- eng(e), name(0) {}
-
- QScriptNameIdImpl *operator() (AST::PropertyName *node)
- {
- name = 0;
- node->accept(this);
- return name;
- }
-
-protected:
- virtual bool visit(AST::IdentifierPropertyName *node)
- {
- name = node->id;
- return false;
- }
-
- virtual bool visit(AST::StringLiteralPropertyName *node)
- {
- name = node->id;
- return false;
- }
-
- virtual bool visit(AST::NumericLiteralPropertyName *node)
- {
- name = eng->nameId(QString::number(node->id), /*persistent=*/false); // ### don't use QString::number
- name->persistent = true; // ### remove
- return false;
- }
-
-private:
- QScriptEnginePrivate *eng;
- QScriptNameIdImpl *name;
-};
-
-class EmptySourceElements: protected AST::Visitor
-{
-public:
- EmptySourceElements(QScriptEngine *d):
- driver(d), empty(false) {}
-
- inline bool operator () (AST::Node *)
- {
- empty = false;
- return empty;
- }
-
-private:
- QScriptEngine *driver;
- bool empty;
-};
-
-class DeclareLocals: protected AST::Visitor
-{
-public:
- DeclareLocals(Compiler *c):
- compiler(c),
- eng(c->engine())
- {
- }
-
- void operator () (AST::Node *node)
- {
- if (node)
- node->accept(this);
- }
-
-protected:
- virtual bool visit(AST::FunctionDeclaration *node)
- {
- compiler->iDeclareLocal(node->name, /*readOnly=*/false);
- return false;
- }
-
- virtual bool visit(AST::FunctionExpression *)
- { return false; }
-
- virtual bool visit(AST::VariableDeclaration *node)
- {
- compiler->iDeclareLocal(node->name, node->readOnly);
- return false;
- }
-
-private:
- Compiler *compiler;
- QScriptEnginePrivate *eng;
-};
-
-Compiler::Compiler(QScriptEnginePrivate *eng):
- m_eng(eng),
- m_generateReferences(0), m_iterationStatement(0),
- m_switchStatement(0), m_withStatement(0),
- m_generateLeaveWithOnBreak(0), m_generateFastArgumentLookup(0),
- m_parseStatements(0), m_pad(0),
- m_topLevelCompiler(false),
- m_activeLoop(0)
-{
-}
-
-Compiler::~Compiler()
-{
-}
-
-bool Compiler::topLevelCompiler() const
-{
- return m_topLevelCompiler;
-}
-
-void Compiler::setTopLevelCompiler(bool b)
-{
- m_topLevelCompiler = b;
-}
-
- CompilationUnit Compiler::compile(AST::Node *node, const QList<QScriptNameIdImpl *> &formals)
-{
- m_formals = formals;
- m_generateReferences = 0;
- m_iterationStatement = 0;
- m_switchStatement = 0;
- m_withStatement = 0;
- m_generateLeaveWithOnBreak = 0;
- m_generateFastArgumentLookup = 0;
- m_parseStatements = 0;
- m_pad = 0;
- m_instructions.clear();
- m_exceptionHandlers.clear();
- m_generateFastArgumentLookup = false; // ### !formals.isEmpty(); // ### disabled for now.. it's buggy :(
-
- m_compilationUnit = CompilationUnit();
-
- if (node)
- node->accept(this);
-
- // add a terminator
- if (topLevelCompiler()) {
- iHalt();
- } else if (m_instructions.isEmpty() || m_instructions.last().op != QScriptInstruction::OP_Ret) {
- iLoadUndefined();
- iRet();
- }
-
- m_compilationUnit.setInstructions(m_instructions);
- m_compilationUnit.setExceptionHandlers(m_exceptionHandlers);
- return m_compilationUnit;
-}
-
-bool Compiler::preVisit(AST::Node *)
-{
- return m_compilationUnit.isValid();
-}
-
-bool Compiler::visit(AST::SourceElements *node)
-{
- DeclareLocals declareLocals(this);
- declareLocals(node);
-
- bool was = changeParseStatements(false);
-
- for (AST::SourceElements *it = node; it != 0; it = it->next)
- it->element->accept(this);
-
- changeParseStatements(true);
-
- for (AST::SourceElements *it = node; it != 0; it = it->next)
- it->element->accept(this);
-
- changeParseStatements(was);
-
- return false;
-}
-
-bool Compiler::visit(AST::StatementList *)
-{
- return true;
-}
-
-bool Compiler::visit(AST::FunctionSourceElement *)
-{
- return m_parseStatements == 0;
-}
-
-bool Compiler::visit(AST::StatementSourceElement *)
-{
- return m_parseStatements;
-}
-
-bool Compiler::visit(AST::ThisExpression *)
-{
- iLoadThis();
- return false;
-}
-
-bool Compiler::visit(AST::NullExpression *)
-{
- iLoadNull();
- return false;
-}
-
-bool Compiler::visit(AST::RegExpLiteral *node)
-{
- Q_ASSERT(node->pattern != 0);
-
- if (node->flags)
- iNewRegExp(node->pattern, node->flags);
- else
- iNewRegExp(node->pattern);
-
- return false;
-}
-
-bool Compiler::visit(AST::NumericLiteral *node)
-{
- iLoadNumber(node->value);
- return false;
-}
-
-bool Compiler::visit(AST::StringLiteral *node)
-{
- iNewString(node->value);
-
- return false;
-}
-
-bool Compiler::visit(AST::ObjectLiteral *node)
-{
- iNewObject();
-
- FetchName fetchName(m_eng);
- bool was = generateReferences(false);
- for (AST::PropertyNameAndValueList *it = node->properties; it != 0; it = it->next) {
- iLine(it->value);
- iDuplicate();
-
- QScriptNameIdImpl *name = fetchName(it->name);
- Q_ASSERT(name != 0);
- iLoadString(name);
- iMakeReference();
-
- it->value->accept(this);
- iPutField();
- }
- generateReferences(was);
-
- return false;
-}
-
-bool Compiler::visit(AST::IdentifierExpression *node)
-{
- Q_ASSERT(node->name != 0);
-
- if (node->name == m_eng->idTable()->id_arguments)
- iLazyArguments();
- if (m_generateReferences)
- iResolve(node->name);
- else
- iFetch(node->name);
-
- return false;
-}
-
-bool Compiler::visit(AST::FunctionDeclaration *node)
-{
- iLoadActivation();
- iLoadString(node->name);
- iMakeReference();
- iNewClosure(node);
- iPutField();
- return false;
-}
-
-bool Compiler::visit(AST::FunctionExpression *node)
-{
- iNewClosure(node);
- if (node->name) {
- iDuplicate();
- iLoadActivation();
- iSwap();
- iLoadString(node->name);
- iSwap();
- iMakeReference();
- iSwap();
- iPutField();
- }
- return false;
-}
-
-bool Compiler::visit(AST::CallExpression *node)
-{
- bool was = generateReferences(true);
- node->base->accept(this);
- generateReferences(false);
-
- int argc = 0;
- for (AST::ArgumentList *it = node->arguments; it != 0; it = it->next) {
- it->expression->accept(this);
- ++argc;
- }
-
- generateReferences(was);
-
- iCall(argc);
- return false;
-}
-
-bool Compiler::visit(AST::NewExpression *node)
-{
- bool was = generateReferences(true);
- node->expression->accept(this);
- generateReferences(was);
- iNew(0);
- return false;
-}
-
-bool Compiler::visit(AST::NewMemberExpression *node)
-{
- bool was = generateReferences(true);
- node->base->accept(this);
- generateReferences(false);
-
- int argc = 0;
- for (AST::ArgumentList *it = node->arguments; it != 0; it = it->next) {
- it->expression->accept(this);
- ++argc;
- }
-
- generateReferences(was);
-
- iNew(argc);
- return false;
-}
-
-bool Compiler::visit(AST::FieldMemberExpression *node)
-{
- bool was = generateReferences(false);
- node->base->accept(this);
- generateReferences(was);
-
- iLoadString(node->name);
-
- if (! was)
- iFetchField();
- else
- iMakeReference();
-
- return false;
-}
-
-bool Compiler::visit(AST::ArrayMemberExpression *node)
-{
- bool was = generateReferences(false);
- node->base->accept(this);
- node->expression->accept(this);
- generateReferences(was);
-
- if (! was)
- iFetchField();
- else
- iMakeReference();
-
- return false;
-}
-
-bool Compiler::visit(AST::PostIncrementExpression *node)
-{
- bool was = generateReferences(true);
- node->base->accept(this);
- generateReferences(was);
- iPostIncr();
-
- return false;
-}
-
-bool Compiler::visit(AST::PostDecrementExpression *node)
-{
- bool was = generateReferences(true);
- node->base->accept(this);
- generateReferences(was);
- iPostDecr();
-
- return false;
-}
-
-bool Compiler::visit(AST::PreIncrementExpression *node)
-{
- bool was = generateReferences(true);
- node->expression->accept(this);
- generateReferences(was);
- iIncr();
- return false;
-}
-
-bool Compiler::visit(AST::PreDecrementExpression *node)
-{
- bool was = generateReferences(true);
- node->expression->accept(this);
- generateReferences(was);
- iDecr();
- return false;
-}
-
-void Compiler::endVisit(AST::NotExpression *)
-{
- iNot();
-}
-
-void Compiler::endVisit(AST::TildeExpression *)
-{
- iBitNot();
-}
-
-bool Compiler::visit(AST::ThrowStatement *node)
-{
- iLine(node);
- return true;
-}
-
-bool Compiler::visit(AST::TryStatement *node)
-{
- int start = nextInstructionOffset();
- if (node->statement)
- node->statement->accept(this);
- int end = nextInstructionOffset();
- if (node->catchExpression) {
- iBranch(0); // skip the catch if no exception
- ExceptionHandlerDescriptor ehd(start, end, nextInstructionOffset());
- m_exceptionHandlers.append(ehd);
- iBeginCatch(node->catchExpression->name);
- node->catchExpression->statement->accept(this);
- iEndCatch();
- patchInstruction(end, nextInstructionOffset() - end);
- }
- if (node->finallyExpression) {
- if (!node->catchExpression) {
- ExceptionHandlerDescriptor ehd(start, end, nextInstructionOffset());
- m_exceptionHandlers.prepend(ehd);
- }
- node->finallyExpression->statement->accept(this);
- }
- return false;
-}
-
-void Compiler::endVisit(AST::ThrowStatement *node)
-{
- if (! node->expression)
- iLoadUndefined();
-
- iThrow();
-}
-
-void Compiler::endVisit(AST::VoidExpression *)
-{
- iPop();
- iLoadUndefined();
-}
-
-bool Compiler::visit(AST::TypeOfExpression *node)
-{
- bool was = generateReferences(true);
- node->expression->accept(this);
- generateReferences(was);
- iTypeOf();
- return false;
-}
-
-bool Compiler::visit(AST::DeleteExpression *node)
-{
- bool was = generateReferences(true);
- node->expression->accept(this);
- generateReferences(was);
- iDelete();
- return false;
-}
-
-bool Compiler::visit(AST::ReturnStatement *node)
-{
- if (topLevelCompiler()) {
- m_compilationUnit.setError(QString::fromUtf8("return outside function body"),
- node->startLine);
- return false;
- }
- iLine(node);
- return true;
-}
-
-void Compiler::endVisit(AST::ReturnStatement *node)
-{
- if (! node->expression)
- iLoadUndefined();
-
- iRet();
-}
-
-bool Compiler::visit(AST::VariableStatement *node)
-{
- AST::VariableDeclarationList *lst = node->declarations;
- while (lst) {
- if (lst->declaration->expression) {
- iLine(node);
- break;
- }
- lst = lst->next;
- }
- return true;
-}
-
-bool Compiler::visit(AST::VariableDeclaration *node)
-{
- if (node->expression != 0) {
- iResolve(node->name);
- node->expression->accept(this);
- iAssign();
- iPop();
- }
-
- return false;
-}
-
-bool Compiler::visit(AST::ConditionalExpression *node)
-{
- node->expression->accept(this);
-
- int cond = nextInstructionOffset();
- iBranchFalse(0);
-
- node->ok->accept(this);
-
- if (! node->ko) {
- patchInstruction(cond, nextInstructionOffset() - cond);
- } else {
- int terminator = nextInstructionOffset();
- iBranch(0);
- node->ko->accept(this);
-
- patchInstruction(cond, terminator + 1 - cond);
- patchInstruction(terminator, nextInstructionOffset() - terminator);
- }
-
- return false;
-}
-
-bool Compiler::visit(AST::IfStatement *node)
-{
- iLine(node);
- node->expression->accept(this);
-
- int cond = nextInstructionOffset();
- iBranchFalse(0);
-
- node->ok->accept(this);
-
- if (! node->ko) {
- patchInstruction(cond, nextInstructionOffset() - cond);
- } else {
- int terminator = nextInstructionOffset();
- iBranch(0);
- node->ko->accept(this);
-
- patchInstruction(cond, terminator + 1 - cond);
- patchInstruction(terminator, nextInstructionOffset() - terminator);
- }
- if (!m_instructions.isEmpty() && m_instructions.last().op == QScriptInstruction::OP_Ret)
- iNop();
-
- return false;
-}
-
-bool Compiler::visit(AST::Block *node)
-{
- if (node->statements && m_loops.contains(node)) {
- Loop &loop = m_loops[node];
-
- node->statements->accept(this);
-
- loop.breakLabel.offset = nextInstructionOffset();
-
- foreach (int index, loop.breakLabel.uses) {
- patchInstruction(index, loop.breakLabel.offset - index);
- }
-
- return false;
- }
-
- return true;
-}
-
-bool Compiler::visit(AST::WhileStatement *node)
-{
- Loop *previousLoop = changeActiveLoop(&m_loops[node]);
- m_activeLoop->continueLabel.offset = nextInstructionOffset();
-
- iLine(node);
- int again = nextInstructionOffset();
- node->expression->accept(this);
-
- int cond = nextInstructionOffset();
- iBranchFalse(0);
-
- bool was = iterationStatement(true);
- bool was2 = generateLeaveOnBreak(false);
- node->statement->accept(this);
- generateLeaveOnBreak(was2);
- iterationStatement(was);
-
- iBranch(again - nextInstructionOffset());
- patchInstruction(cond, nextInstructionOffset() - cond);
-
- m_activeLoop->breakLabel.offset = nextInstructionOffset();
-
- foreach (int index, m_activeLoop->breakLabel.uses) {
- patchInstruction(index, m_activeLoop->breakLabel.offset - index);
- }
-
- foreach (int index, m_activeLoop->continueLabel.uses) {
- patchInstruction(index, m_activeLoop->continueLabel.offset - index);
- }
-
- changeActiveLoop(previousLoop);
- m_loops.remove(node);
-
- return false;
-}
-
-bool Compiler::visit(AST::DoWhileStatement *node)
-{
- Loop *previousLoop = changeActiveLoop(&m_loops[node]);
- int again = nextInstructionOffset();
- iLine(node);
- bool was = iterationStatement(true);
- node->statement->accept(this);
- iterationStatement(was);
-
- m_activeLoop->continueLabel.offset = nextInstructionOffset();
-
- node->expression->accept(this);
-
- iBranchTrue(again - nextInstructionOffset());
- m_activeLoop->breakLabel.offset = nextInstructionOffset();
-
- foreach (int index, m_activeLoop->breakLabel.uses) {
- patchInstruction(index, m_activeLoop->breakLabel.offset - index);
- }
-
- foreach (int index, m_activeLoop->continueLabel.uses) {
- patchInstruction(index, m_activeLoop->continueLabel.offset - index);
- }
-
- changeActiveLoop(previousLoop);
- m_loops.remove(node);
-
- return false;
-}
-
-bool Compiler::visit(AST::ForEachStatement *node)
-{
- Loop *previousLoop = changeActiveLoop(&m_loops[node]);
-
- iLine(node);
- node->expression->accept(this);
- iNewEnumeration();
- iDuplicate();
- iToFirstElement();
-
- int again = nextInstructionOffset();
- m_activeLoop->continueLabel.offset = again;
- iDuplicate();
- iHasNextElement();
- int cond = nextInstructionOffset();
- iBranchFalse(0);
- bool was = generateReferences(true);
- node->initialiser->accept(this);
- generateReferences(was);
- iNextElement();
- iAssign();
- iPop();
- was = iterationStatement(true);
- node->statement->accept(this);
- iterationStatement(was);
- iBranch(again - nextInstructionOffset());
- patchInstruction(cond, nextInstructionOffset() - cond);
-
- m_activeLoop->breakLabel.offset = nextInstructionOffset();
- iPop(); // pop the Enumeration
-
- foreach (int index, m_activeLoop->breakLabel.uses) {
- patchInstruction(index, m_activeLoop->breakLabel.offset - index);
- }
-
- foreach (int index, m_activeLoop->continueLabel.uses) {
- patchInstruction(index, m_activeLoop->continueLabel.offset - index);
- }
-
- changeActiveLoop(previousLoop);
- m_loops.remove(node);
-
- return false;
-}
-
-bool Compiler::visit(AST::LocalForEachStatement *node)
-{
- Loop *previousLoop = changeActiveLoop(&m_loops[node]);
-
- iLine(node);
- node->declaration->accept(this);
- node->expression->accept(this);
- iNewEnumeration();
- iDuplicate();
- iToFirstElement();
-
- int again = nextInstructionOffset();
- m_activeLoop->continueLabel.offset = again;
- iDuplicate();
- iHasNextElement();
- int cond = nextInstructionOffset();
- iBranchFalse(0);
- iResolve(node->declaration->name);
- iNextElement();
- iAssign();
- iPop();
- bool was = iterationStatement(true);
- node->statement->accept(this);
- iterationStatement(was);
- iBranch(again - nextInstructionOffset());
- patchInstruction(cond, nextInstructionOffset() - cond);
-
- m_activeLoop->breakLabel.offset = nextInstructionOffset();
- iPop(); // pop the Enumeration
-
- foreach (int index, m_activeLoop->breakLabel.uses) {
- patchInstruction(index, m_activeLoop->breakLabel.offset - index);
- }
-
- foreach (int index, m_activeLoop->continueLabel.uses) {
- patchInstruction(index, m_activeLoop->continueLabel.offset - index);
- }
-
- changeActiveLoop(previousLoop);
- m_loops.remove(node);
-
- return false;
-}
-
-void Compiler::visitForInternal(AST::Statement *node, AST::ExpressionNode *condition, AST::Statement *statement, AST::ExpressionNode *expression)
-{
- Q_ASSERT(statement != 0);
-
- int again = nextInstructionOffset();
- if (condition != 0) {
-// iLine(condition);
- condition->accept(this);
- } else {
-// iLine(node);
- iLoadNumber(1);
- }
-
- int cond = nextInstructionOffset();
- iBranchFalse(0);
-
- Loop *previousLoop = changeActiveLoop(&m_loops[node]);
-
- bool was = iterationStatement(true);
- statement->accept(this);
- iterationStatement(was);
-
- m_activeLoop->continueLabel.offset = nextInstructionOffset();
-
- if (expression != 0) {
- expression->accept(this);
- iPop();
- }
-
- iBranch(again - nextInstructionOffset());
- patchInstruction(cond, nextInstructionOffset() - cond);
-
- m_activeLoop->breakLabel.offset = nextInstructionOffset();
-
- foreach (int index, m_activeLoop->breakLabel.uses) {
- patchInstruction(index, m_activeLoop->breakLabel.offset - index);
- }
-
- foreach (int index, m_activeLoop->continueLabel.uses) {
- patchInstruction(index, m_activeLoop->continueLabel.offset - index);
- }
-
- changeActiveLoop(previousLoop);
- m_loops.remove(node);
-}
-
-bool Compiler::visit(AST::ForStatement *node)
-{
- iLine(node);
-
- if (node->initialiser != 0) {
- node->initialiser->accept(this);
- iPop();
- }
-
- visitForInternal(node, node->condition, node->statement, node->expression);
- return false;
-}
-
-bool Compiler::visit(AST::LocalForStatement *node)
-{
- iLine(node);
-
- if (node->declarations)
- node->declarations->accept(this);
-
- visitForInternal(node, node->condition, node->statement, node->expression);
- return false;
-}
-
-bool Compiler::isAssignmentOperator(int op) const
-{
- switch (op) {
-
- case QSOperator::Assign:
- case QSOperator::InplaceAnd:
- case QSOperator::InplaceSub:
- case QSOperator::InplaceDiv:
- case QSOperator::InplaceAdd:
- case QSOperator::InplaceLeftShift:
- case QSOperator::InplaceMod:
- case QSOperator::InplaceMul:
- case QSOperator::InplaceOr:
- case QSOperator::InplaceRightShift:
- case QSOperator::InplaceURightShift:
- case QSOperator::InplaceXor:
- return true;
-
- default:
- break;
-
- }
-
- return false;
-}
-
-int Compiler::inplaceAssignmentOperator(int op) const
-{
- switch (op) {
- case QSOperator::BitAnd:
- return QSOperator::InplaceAnd;
- case QSOperator::Sub:
- return QSOperator::InplaceSub;
- case QSOperator::Div:
- return QSOperator::InplaceDiv;
- case QSOperator::Add:
- return QSOperator::InplaceAdd;
- case QSOperator::LShift:
- return QSOperator::InplaceLeftShift;
- case QSOperator::Mod:
- return QSOperator::InplaceMod;
- case QSOperator::Mul:
- return QSOperator::InplaceMul;
- case QSOperator::BitOr:
- return QSOperator::InplaceOr;
- case QSOperator::RShift:
- return QSOperator::InplaceRightShift;
- case QSOperator::URShift:
- return QSOperator::InplaceURightShift;
- case QSOperator::BitXor:
- return QSOperator::InplaceXor;
-
- default:
- break;
-
- }
-
- return(-1);
-}
-
-bool Compiler::visit(AST::Expression *node)
-{
- node->left->accept(this);
- iPop(); // ### or iSync?
- node->right->accept(this);
- return false;
-}
-
-bool Compiler::visit(AST::BinaryExpression *node)
-{
- if (isAssignmentOperator(node->op)) {
- bool was = generateReferences(true);
- node->left->accept(this);
- generateReferences(was);
- } else {
- node->left->accept(this);
- }
-
- int address = 0;
- if (node->op == QSOperator::Or || node->op == QSOperator::And) {
- iDuplicate();
- address = nextInstructionOffset();
- if (node->op == QSOperator::Or)
- iBranchTrue(0);
- else
- iBranchFalse(0);
- iPop();
- }
-
- int op = node->op;
- Compare compare;
- if ((op == QSOperator::Assign) && node->right->binaryExpressionCast()
- && (inplaceAssignmentOperator(node->right->binaryExpressionCast()->op) != -1)
- && compare(node->left, node->right->binaryExpressionCast()->left)) {
- // node->left is equivalent to node->right->left, so we generate
- // x op= y rather than x = x op y
- op = inplaceAssignmentOperator(node->right->binaryExpressionCast()->op);
- node->right->binaryExpressionCast()->right->accept(this);
- } else {
- node->right->accept(this);
- }
-
- switch (op) {
-
- case QSOperator::Assign:
- iAssign();
- break;
-
- case QSOperator::InplaceAnd:
- iInplaceAnd();
- break;
-
- case QSOperator::InplaceSub:
- iInplaceSub();
- break;
-
- case QSOperator::InplaceDiv:
- iInplaceDiv();
- break;
-
- case QSOperator::InplaceAdd:
- iInplaceAdd();
- break;
-
- case QSOperator::InplaceLeftShift:
- iInplaceLeftShift();
- break;
-
- case QSOperator::InplaceMod:
- iInplaceMod();
- break;
-
- case QSOperator::InplaceMul:
- iInplaceMul();
- break;
-
- case QSOperator::InplaceOr:
- iInplaceOr();
- break;
-
- case QSOperator::InplaceRightShift:
- iInplaceRightShift();
- break;
-
- case QSOperator::InplaceURightShift:
- iInplaceURightShift();
- break;
-
- case QSOperator::InplaceXor:
- iInplaceXor();
- break;
-
- case QSOperator::BitAnd:
- iBitAnd();
- break;
-
- case QSOperator::BitOr:
- iBitOr();
- break;
-
- case QSOperator::BitXor:
- iBitXor();
- break;
-
- case QSOperator::LShift:
- iLeftShift();
- break;
-
- case QSOperator::Mod:
- iMod();
- break;
-
- case QSOperator::RShift:
- iRightShift();
- break;
-
- case QSOperator::URShift:
- iURightShift();
- break;
-
- case QSOperator::InstanceOf:
- iInstanceOf();
- break;
-
- case QSOperator::Add:
- iAdd();
- break;
-
- case QSOperator::And:
- patchInstruction(address, nextInstructionOffset() - address);
- break;
-
- case QSOperator::Div:
- iDiv();
- break;
-
- case QSOperator::Equal:
- iEqual();
- break;
-
- case QSOperator::Ge:
- iGreatOrEqual();
- break;
-
- case QSOperator::Gt:
- iGreatThan();
- break;
-
- case QSOperator::Le:
- iLessOrEqual();
- break;
-
- case QSOperator::Lt:
- iLessThan();
- break;
-
- case QSOperator::Mul:
- iMul();
- break;
-
- case QSOperator::NotEqual:
- iNotEqual();
- break;
-
- case QSOperator::Or:
- patchInstruction(address, nextInstructionOffset() - address);
- break;
-
- case QSOperator::Sub:
- iSub();
- break;
-
- case QSOperator::StrictEqual:
- iStrictEqual();
- break;
-
- case QSOperator::StrictNotEqual:
- iStrictNotEqual();
- break;
-
- case QSOperator::In:
- iIn();
- break;
- }
-
- return false;
-}
-
-bool Compiler::visit(AST::TrueLiteral *)
-{
- iLoadTrue();
- return false;
-}
-
-bool Compiler::visit(AST::FalseLiteral *)
-{
- iLoadFalse();
- return false;
-}
-
-bool Compiler::visit(AST::SwitchStatement *node)
-{
- iLine(node);
- Loop *previousLoop = changeActiveLoop(&m_loops[node]);
-
- node->expression->accept(this);
-
- bool was = switchStatement(true);
-
- AST::CaseClauses *clauses;
- int skipIndex = -1;
- int fallthroughIndex = -1;
- // ### make a function for this
- for (clauses = node->block->clauses; clauses != 0; clauses = clauses->next) {
- AST::CaseClause *clause = clauses->clause;
- if (skipIndex != -1)
- patchInstruction(skipIndex, nextInstructionOffset() - skipIndex);
-
- iDuplicate(); // expression
- clause->expression->accept(this);
- iStrictEqual();
- skipIndex = nextInstructionOffset();
- iBranchFalse(0); // next case
-
- if (fallthroughIndex != -1) // previous case falls through to here
- patchInstruction(fallthroughIndex, nextInstructionOffset() - fallthroughIndex);
-
- int breaksBefore = m_activeLoop->breakLabel.uses.count();
- if (clause->statements)
- clause->statements->accept(this);
- int breaksAfter = m_activeLoop->breakLabel.uses.count();
- if (breaksAfter == breaksBefore) { // fallthrough
- fallthroughIndex = nextInstructionOffset();
- iBranch(0);
- } else { // no fallthrough (break)
- fallthroughIndex = -1;
- }
- }
-
- if (fallthroughIndex != -1) {
- patchInstruction(fallthroughIndex, nextInstructionOffset() - fallthroughIndex);
- fallthroughIndex = -1;
- }
-
- int defaultIndex = -1;
- if (node->block->defaultClause) {
- int skipDefaultIndex = -1;
- if (!node->block->clauses && node->block->moreClauses) {
- skipDefaultIndex = nextInstructionOffset();
- iBranch(0);
- }
- defaultIndex = nextInstructionOffset();
- int breaksBefore = m_activeLoop->breakLabel.uses.count();
- if (node->block->defaultClause->statements)
- node->block->defaultClause->statements->accept(this);
- int breaksAfter = m_activeLoop->breakLabel.uses.count();
- if (breaksAfter == breaksBefore) { // fallthrough
- fallthroughIndex = nextInstructionOffset();
- iBranch(0);
- } else { // no fallthrough (break)
- fallthroughIndex = -1;
- }
- if (skipDefaultIndex != -1)
- patchInstruction(skipDefaultIndex, nextInstructionOffset() - skipDefaultIndex);
- }
-
- for (clauses = node->block->moreClauses; clauses != 0; clauses = clauses->next) {
- AST::CaseClause *clause = clauses->clause;
- if (skipIndex != -1)
- patchInstruction(skipIndex, nextInstructionOffset() - skipIndex);
-
- iDuplicate(); // expression
- clause->expression->accept(this);
- iStrictEqual();
- skipIndex = nextInstructionOffset();
- iBranchFalse(0); // next case
-
- if (fallthroughIndex != -1) // previous case falls through to here
- patchInstruction(fallthroughIndex, nextInstructionOffset() - fallthroughIndex);
-
- int breaksBefore = m_activeLoop->breakLabel.uses.count();
- if (clause->statements)
- clause->statements->accept(this);
- int breaksAfter = m_activeLoop->breakLabel.uses.count();
- if (breaksAfter == breaksBefore) { // fallthrough
- fallthroughIndex = nextInstructionOffset();
- iBranch(0);
- } else { // no fallthrough (break)
- fallthroughIndex = -1;
- }
- }
-
- if (skipIndex != -1) {
- patchInstruction(skipIndex, nextInstructionOffset() - skipIndex);
- if (defaultIndex != -1)
- iBranch(defaultIndex - nextInstructionOffset()); // goto default
- }
-
- if (fallthroughIndex != -1)
- patchInstruction(fallthroughIndex, nextInstructionOffset() - fallthroughIndex);
-
- // backpatch the breaks
- int term = nextInstructionOffset();
- foreach (int index, m_activeLoop->breakLabel.uses) {
- patchInstruction(index, term - index);
- }
-
- iPop(); // expression
-
- if (previousLoop && !m_activeLoop->continueLabel.uses.isEmpty()) {
- // join the continues and add to outer loop
- iBranch(3);
- foreach (int index, m_activeLoop->continueLabel.uses) {
- patchInstruction(index, nextInstructionOffset() - index);
- }
- iPop();
- iBranch(0);
- previousLoop->continueLabel.uses.append(nextInstructionOffset() - 1);
- }
-
- switchStatement(was);
- changeActiveLoop(previousLoop);
- m_loops.remove(node);
- return false;
-}
-
-bool Compiler::visit(AST::LabelledStatement *node)
-{
- Loop *loop = findLoop(node->label);
- if (loop != 0) {
- QString str = m_eng->toString(node->label);
- m_compilationUnit.setError(QString::fromUtf8("duplicate label `%1'").arg(str),
- node->startLine);
- return false;
- }
-
- loop = &m_loops[node->statement];
- loop->name = node->label;
- node->statement->accept(this);
- if (m_loops.contains(node->statement)) {
- loop->breakLabel.offset = nextInstructionOffset();
- foreach (int index, loop->breakLabel.uses) {
- patchInstruction(index, loop->breakLabel.offset - index);
- }
- m_loops.remove(node->statement);
- }
- return false;
-}
-
-bool Compiler::visit(AST::ExpressionStatement *node)
-{
- if (node->expression)
- iLine(node->expression);
- return true;
-}
-
-void Compiler::endVisit(AST::ExpressionStatement *)
-{
- if (topLevelCompiler())
- iSync();
- else
- iPop();
-}
-
-void Compiler::endVisit(AST::UnaryPlusExpression *)
-{
- iUnaryPlus();
-}
-
-void Compiler::endVisit(AST::UnaryMinusExpression *)
-{
- iUnaryMinus();
-}
-
-bool Compiler::visit(AST::ContinueStatement *node)
-{
- iLine(node);
- return true;
-}
-
-void Compiler::endVisit(AST::ContinueStatement *node)
-{
- int offset = nextInstructionOffset();
- iBranch(0);
-
- Loop *loop = findLoop(node->label);
- if (!loop || !m_iterationStatement) {
- m_compilationUnit.setError(QString::fromUtf8("label not found"),
- node->startLine);
- return;
- }
-
- loop->continueLabel.uses.append(offset);
-}
-
-bool Compiler::visit(AST::BreakStatement *node)
-{
- iLine(node);
- return true;
-}
-
-void Compiler::endVisit(AST::BreakStatement *node)
-{
- Loop *loop = findLoop(node->label);
- if (! loop) {
- m_compilationUnit.setError(QString::fromUtf8("label not found"),
- node->startLine);
- return;
- }
-
- if (m_generateLeaveWithOnBreak)
- iLeaveWith();
- int offset = nextInstructionOffset();
- iBranch(0);
- loop->breakLabel.uses.append(offset);
-}
-
-void Compiler::endVisit(AST::EmptyStatement *node)
-{
- iLine(node);
-}
-
-bool Compiler::visit(AST::DebuggerStatement *node)
-{
- iLine(node);
- iDebugger();
- return false;
-}
-
-void Compiler::patchInstruction(int index, int offset)
-{
- QScriptInstruction &i = m_instructions[index];
-
- switch (i.op) {
- case QScriptInstruction::OP_Branch:
- case QScriptInstruction::OP_BranchFalse:
- case QScriptInstruction::OP_BranchTrue:
- m_eng->newInteger(&i.operand[0], offset);
- break;
-
- default:
- Q_ASSERT_X(0, "Compiler::patchInstruction()", "expected a branch instruction");
- break;
- }
-}
-
-bool Compiler::visit(AST::WithStatement *node)
-{
- iLine(node);
- node->expression->accept(this);
- iEnterWith();
- bool was = withStatement(true);
- bool was2 = generateLeaveOnBreak(true);
- node->statement->accept(this);
- generateLeaveOnBreak(was2);
- withStatement(was);
- iLeaveWith();
- return false;
-}
-
-bool Compiler::visit(AST::ArrayLiteral *node)
-{
- iNewArray();
-
- int length = 0;
-
- for (AST::ElementList *it = node->elements; it != 0; it = it->next) {
- for (AST::Elision *eit = it->elision; eit != 0; eit = eit->next) {
- iDuplicate();
- iLoadNumber(length);
- iMakeReference();
- iLoadUndefined();
- iAssign();
- iPop();
- ++length;
- }
-
- if (it->expression) {
- iDuplicate();
- iLoadNumber(length);
- iMakeReference();
- it->expression->accept(this);
- iAssign();
- iPop();
- ++length;
- }
- }
-
- for (AST::Elision *eit = node->elision; eit != 0; eit = eit->next) {
- iDuplicate();
- iLoadNumber(length);
- iMakeReference();
- iLoadUndefined();
- iAssign();
- iPop();
- ++length;
- }
-
- return false;
-}
-
-void Compiler::iLoadUndefined()
-{
- pushInstruction(QScriptInstruction::OP_LoadUndefined);
-}
-
-void Compiler::iLoadThis()
-{
- pushInstruction(QScriptInstruction::OP_LoadThis);
-}
-
-void Compiler::iLoadActivation()
-{
- pushInstruction(QScriptInstruction::OP_LoadActivation);
-}
-
-void Compiler::iLoadNull()
-{
- pushInstruction(QScriptInstruction::OP_LoadNull);
-}
-
-void Compiler::iLoadNumber(double number)
-{
- QScriptValueImpl arg0(number);
- pushInstruction(QScriptInstruction::OP_LoadNumber, arg0);
-}
-
-void Compiler::iLoadString(QScriptNameIdImpl *id)
-{
- QScriptValueImpl arg0;
- id->persistent = true;
- m_eng->newNameId(&arg0, id);
- pushInstruction(QScriptInstruction::OP_LoadString, arg0);
-}
-
-void Compiler::iDuplicate()
-{
- pushInstruction(QScriptInstruction::OP_Duplicate);
-}
-
-void Compiler::iSwap()
-{
- pushInstruction(QScriptInstruction::OP_Swap);
-}
-
-void Compiler::iResolve(QScriptNameIdImpl *id)
-{
- QScriptValueImpl arg0;
- id->persistent = true;
- m_eng->newNameId(&arg0, id);
- pushInstruction(QScriptInstruction::OP_Resolve, arg0);
-}
-
-void Compiler::iPutField()
-{
- pushInstruction(QScriptInstruction::OP_PutField);
-}
-
-void Compiler::iCall(int argc)
-{
- QScriptValueImpl arg0;
- m_eng->newInteger(&arg0, argc);
- pushInstruction(QScriptInstruction::OP_Call, arg0);
-}
-
-void Compiler::iNew(int argc)
-{
- QScriptValueImpl arg0;
- m_eng->newInteger(&arg0, argc);
- pushInstruction(QScriptInstruction::OP_New, arg0);
-}
-
-void Compiler::iFetchField()
-{
- pushInstruction(QScriptInstruction::OP_FetchField);
-}
-
-void Compiler::iLazyArguments()
-{
- pushInstruction(QScriptInstruction::OP_LazyArguments);
-}
-
-void Compiler::iRet()
-{
- pushInstruction(QScriptInstruction::OP_Ret);
-}
-
-void Compiler::iDeclareLocal(QScriptNameIdImpl *id, bool readOnly)
-{
- QScriptValueImpl arg0;
- id->persistent = true;
- m_eng->newNameId(&arg0, id);
- QScriptValueImpl arg1;
- m_eng->newInteger(&arg1, readOnly);
- pushInstruction(QScriptInstruction::OP_DeclareLocal, arg0, arg1);
-}
-
-void Compiler::iAssign()
-{
- pushInstruction(QScriptInstruction::OP_Assign);
-}
-
-void Compiler::iBitAnd()
-{
- pushInstruction(QScriptInstruction::OP_BitAnd);
-}
-
-void Compiler::iBitOr()
-{
- pushInstruction(QScriptInstruction::OP_BitOr);
-}
-
-void Compiler::iBitXor()
-{
- pushInstruction(QScriptInstruction::OP_BitXor);
-}
-
-void Compiler::iLeftShift()
-{
- pushInstruction(QScriptInstruction::OP_LeftShift);
-}
-
-void Compiler::iMod()
-{
- pushInstruction(QScriptInstruction::OP_Mod);
-}
-
-void Compiler::iRightShift()
-{
- pushInstruction(QScriptInstruction::OP_RightShift);
-}
-
-void Compiler::iURightShift()
-{
- pushInstruction(QScriptInstruction::OP_URightShift);
-}
-
-void Compiler::iAdd()
-{
- pushInstruction(QScriptInstruction::OP_Add);
-}
-
-void Compiler::iDiv()
-{
- pushInstruction(QScriptInstruction::OP_Div);
-}
-
-void Compiler::iEqual()
-{
- pushInstruction(QScriptInstruction::OP_Equal);
-}
-
-void Compiler::iGreatOrEqual()
-{
- pushInstruction(QScriptInstruction::OP_GreatOrEqual);
-}
-
-void Compiler::iGreatThan()
-{
- pushInstruction(QScriptInstruction::OP_GreatThan);
-}
-
-void Compiler::iLessOrEqual()
-{
- pushInstruction(QScriptInstruction::OP_LessOrEqual);
-}
-
-void Compiler::iLessThan()
-{
- pushInstruction(QScriptInstruction::OP_LessThan);
-}
-
-void Compiler::iMul()
-{
- pushInstruction(QScriptInstruction::OP_Mul);
-}
-
-void Compiler::iNotEqual()
-{
- pushInstruction(QScriptInstruction::OP_NotEqual);
-}
-
-void Compiler::iSub()
-{
- pushInstruction(QScriptInstruction::OP_Sub);
-}
-
-void Compiler::iStrictEqual()
-{
- pushInstruction(QScriptInstruction::OP_StrictEqual);
-}
-
-void Compiler::iStrictNotEqual()
-{
- pushInstruction(QScriptInstruction::OP_StrictNotEqual);
-}
-
-void Compiler::iBranch(int index)
-{
- QScriptValueImpl arg0;
- m_eng->newInteger(&arg0, index);
- pushInstruction(QScriptInstruction::OP_Branch, arg0);
-}
-
-void Compiler::iBranchFalse(int index)
-{
- QScriptValueImpl arg0;
- m_eng->newInteger(&arg0, index);
- pushInstruction(QScriptInstruction::OP_BranchFalse, arg0);
-}
-
-void Compiler::iBranchTrue(int index)
-{
- QScriptValueImpl arg0;
- m_eng->newInteger(&arg0, index);
- pushInstruction(QScriptInstruction::OP_BranchTrue, arg0);
-}
-
-void Compiler::iNewClosure(AST::FunctionExpression *expr)
-{
- QScriptValueImpl arg0;
- m_eng->newPointer(&arg0, expr);
-
- pushInstruction(QScriptInstruction::OP_NewClosure, arg0);
-}
-
-void Compiler::iIncr()
-{
- pushInstruction(QScriptInstruction::OP_Incr);
-}
-
-void Compiler::iDecr()
-{
- pushInstruction(QScriptInstruction::OP_Decr);
-}
-
-void Compiler::iPop()
-{
- pushInstruction(QScriptInstruction::OP_Pop);
-}
-
-void Compiler::iFetch(QScriptNameIdImpl *id)
-{
- if (m_generateFastArgumentLookup) {
- int index = m_formals.indexOf(id);
-
- if (index != -1) {
- QScriptValueImpl arg0;
- m_eng->newInteger(&arg0, index);
- pushInstruction(QScriptInstruction::OP_Receive, arg0);
- return;
- }
- }
-
- QScriptValueImpl arg0;
- id->persistent = true;
- m_eng->newNameId(&arg0, id);
- pushInstruction(QScriptInstruction::OP_Fetch, arg0);
-}
-
-void Compiler::iLoadTrue()
-{
- pushInstruction(QScriptInstruction::OP_LoadTrue);
-}
-
-void Compiler::iLoadFalse()
-{
- pushInstruction(QScriptInstruction::OP_LoadFalse);
-}
-
-void Compiler::iUnaryMinus()
-{
- pushInstruction(QScriptInstruction::OP_UnaryMinus);
-}
-
-void Compiler::iUnaryPlus()
-{
- pushInstruction(QScriptInstruction::OP_UnaryPlus);
-}
-
-void Compiler::iPostIncr()
-{
- pushInstruction(QScriptInstruction::OP_PostIncr);
-}
-
-void Compiler::iPostDecr()
-{
- pushInstruction(QScriptInstruction::OP_PostDecr);
-}
-
-void Compiler::iNewArray()
-{
- pushInstruction(QScriptInstruction::OP_NewArray);
-}
-
-void Compiler::iNewObject()
-{
- pushInstruction(QScriptInstruction::OP_NewObject);
-}
-
-void Compiler::iTypeOf()
-{
- pushInstruction(QScriptInstruction::OP_TypeOf);
-}
-
-void Compiler::iDelete()
-{
- pushInstruction(QScriptInstruction::OP_Delete);
-}
-
-void Compiler::iInstanceOf()
-{
- pushInstruction(QScriptInstruction::OP_InstanceOf);
-}
-
-void Compiler::iInplaceAnd()
-{
- pushInstruction(QScriptInstruction::OP_InplaceAnd);
-}
-
-void Compiler::iInplaceSub()
-{
- pushInstruction(QScriptInstruction::OP_InplaceSub);
-}
-
-void Compiler::iInplaceDiv()
-{
- pushInstruction(QScriptInstruction::OP_InplaceDiv);
-}
-
-void Compiler::iInplaceAdd()
-{
- pushInstruction(QScriptInstruction::OP_InplaceAdd);
-}
-
-void Compiler::iInplaceLeftShift()
-{
- pushInstruction(QScriptInstruction::OP_InplaceLeftShift);
-}
-
-void Compiler::iInplaceMod()
-{
- pushInstruction(QScriptInstruction::OP_InplaceMod);
-}
-
-void Compiler::iInplaceMul()
-{
- pushInstruction(QScriptInstruction::OP_InplaceMul);
-}
-
-void Compiler::iInplaceOr()
-{
- pushInstruction(QScriptInstruction::OP_InplaceOr);
-}
-
-void Compiler::iInplaceRightShift()
-{
- pushInstruction(QScriptInstruction::OP_InplaceRightShift);
-}
-
-void Compiler::iInplaceURightShift()
-{
- pushInstruction(QScriptInstruction::OP_InplaceURightShift);
-}
-
-void Compiler::iInplaceXor()
-{
- pushInstruction(QScriptInstruction::OP_InplaceXor);
-}
-
-void Compiler::iThrow()
-{
- pushInstruction(QScriptInstruction::OP_Throw);
-}
-
-void Compiler::iLine(AST::Node *node)
-{
- if (! node)
- return;
-
- QScriptValueImpl arg0;
- m_eng->newInteger(&arg0, node->startLine);
-
- QScriptValueImpl arg1;
- m_eng->newInteger(&arg1, node->startColumn);
-
- pushInstruction(QScriptInstruction::OP_Line, arg0, arg1);
-}
-
-void Compiler::iBitNot()
-{
- pushInstruction(QScriptInstruction::OP_BitNot);
-}
-
-void Compiler::iNot()
-{
- pushInstruction(QScriptInstruction::OP_Not);
-}
-
-void Compiler::iNewRegExp(QScriptNameIdImpl *pattern)
-{
- QScriptValueImpl arg0;
- pattern->persistent = true;
- m_eng->newNameId(&arg0, pattern);
- pushInstruction(QScriptInstruction::OP_NewRegExp, arg0);
-}
-
-void Compiler::iNewRegExp(QScriptNameIdImpl *pattern, int flags)
-{
- QScriptValueImpl arg0;
- pattern->persistent = true;
- m_eng->newNameId(&arg0, pattern);
-
- QScriptValueImpl arg1;
- m_eng->newInteger(&arg1, flags);
-
- pushInstruction(QScriptInstruction::OP_NewRegExp, arg0, arg1);
-}
-
-void Compiler::iNewEnumeration()
-{
- pushInstruction(QScriptInstruction::OP_NewEnumeration);
-}
-
-void Compiler::iToFirstElement()
-{
- pushInstruction(QScriptInstruction::OP_ToFirstElement);
-}
-
-void Compiler::iHasNextElement()
-{
- pushInstruction(QScriptInstruction::OP_HasNextElement);
-}
-
-void Compiler::iNextElement()
-{
- pushInstruction(QScriptInstruction::OP_NextElement);
-}
-
-void Compiler::iEnterWith()
-{
- pushInstruction(QScriptInstruction::OP_EnterWith);
-}
-
-void Compiler::iLeaveWith()
-{
- pushInstruction(QScriptInstruction::OP_LeaveWith);
-}
-
-void Compiler::iBeginCatch(QScriptNameIdImpl *id)
-{
- QScriptValueImpl arg0;
- id->persistent = true;
- m_eng->newNameId(&arg0, id);
- pushInstruction(QScriptInstruction::OP_BeginCatch, arg0);
-}
-
-void Compiler::iEndCatch()
-{
- pushInstruction(QScriptInstruction::OP_EndCatch);
-}
-
-void Compiler::iSync()
-{
- pushInstruction(QScriptInstruction::OP_Sync);
-}
-
-void Compiler::iHalt()
-{
- pushInstruction(QScriptInstruction::OP_Halt);
-}
-
-void Compiler::iMakeReference()
-{
- pushInstruction(QScriptInstruction::OP_MakeReference);
-}
-
-void Compiler::iIn()
-{
- pushInstruction(QScriptInstruction::OP_In);
-}
-
-void Compiler::iNop()
-{
- pushInstruction(QScriptInstruction::OP_Nop);
-}
-
-void Compiler::iNewString(QScriptNameIdImpl *id)
-{
- QScriptValueImpl arg0;
- id->persistent = true;
- m_eng->newNameId(&arg0, id);
- pushInstruction(QScriptInstruction::OP_NewString, arg0);
-}
-
-void Compiler::iDebugger()
-{
- pushInstruction(QScriptInstruction::OP_Debugger);
-}
-
-Compiler::Loop *Compiler::findLoop(QScriptNameIdImpl *name)
-{
- if (! name)
- return m_activeLoop;
-
- QMap<AST::Statement*, Loop>::iterator it = m_loops.begin();
-
- for (; it != m_loops.end(); ++it) {
- Loop &loop = *it;
-
- if (loop.name == name)
- return &loop;
- }
-
- return 0;
-}
-
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptcompiler_p.h b/src/script/qscriptcompiler_p.h
deleted file mode 100644
index 67fa60f..0000000
--- a/src/script/qscriptcompiler_p.h
+++ /dev/null
@@ -1,377 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCOMPILER_P_H
-#define QSCRIPTCOMPILER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/QMap>
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/QVector>
-
-#include "qscriptastvisitor_p.h"
-#include "qscriptasm_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QScriptEnginePrivate;
-
-namespace QScript {
-
-class Compiler: protected AST::Visitor
-{
-public:
- Compiler(QScriptEnginePrivate *eng);
- virtual ~Compiler();
-
- inline QScriptEnginePrivate *engine() const { return m_eng; }
-
- bool topLevelCompiler() const;
- void setTopLevelCompiler(bool b);
-
- CompilationUnit compile(AST::Node *node, const QList<QScriptNameIdImpl *> &formals
- = QList<QScriptNameIdImpl *>());
-
- struct Label {
- Label(int o = 0):
- offset (o) {}
-
- int offset;
- QVector<int> uses;
- };
-
-// instruction set
- void iAdd();
- void iAssign();
- void iBitAnd();
- void iBitOr();
- void iBitXor();
- void iBitNot();
- void iBranch(int index);
- void iBranchTrue(int index);
- void iBranchFalse(int index);
- void iCall(int argc);
- void iDeclareLocal(QScriptNameIdImpl *id, bool readOnly);
- void iDecr();
- void iDelete();
- void iDiv();
- void iDuplicate();
- void iEqual();
- void iFetch(QScriptNameIdImpl *id);
- void iFetchField();
- void iLazyArguments();
- void iGreatOrEqual();
- void iGreatThan();
- void iIncr();
- void iInplaceAdd();
- void iInplaceAnd();
- void iInplaceDecr();
- void iInplaceDiv();
- void iInplaceLeftShift();
- void iInplaceMod();
- void iInplaceMul();
- void iInplaceOr();
- void iInplaceRightShift();
- void iInplaceSub();
- void iInplaceURightShift();
- void iInstanceOf();
- void iLeftShift();
- void iLessOrEqual();
- void iLessThan();
- void iLoadFalse();
- void iLoadNumber(double number);
- void iLoadString(QScriptNameIdImpl *id);
- void iNewString(QScriptNameIdImpl *id);
- void iLoadThis();
- void iLoadActivation();
- void iLoadNull();
- void iLoadTrue();
- void iLoadUndefined();
- void iMod();
- void iMul();
- void iUnaryPlus();
- void iUnaryMinus();
- void iNew(int argc);
- void iNewArray();
- void iNewClosure(AST::FunctionExpression *expr);
- void iNewObject();
- void iNewRegExp(QScriptNameIdImpl *pattern);
- void iNewRegExp(QScriptNameIdImpl *pattern, int flags);
- void iNot();
- void iNotEqual();
- void iPop();
- void iPostDecr();
- void iPostIncr();
- void iPutField();
- void iResolve(QScriptNameIdImpl *id);
- void iRet();
- void iRightShift();
- void iSub();
- void iStrictEqual();
- void iStrictNotEqual();
- void iSwap();
- void iThrow();
- void iTypeOf();
- void iURightShift();
- void iInplaceXor();
- void iLine(AST::Node *node);
- void iNewEnumeration();
- void iToFirstElement();
- void iHasNextElement();
- void iNextElement();
- void iEnterWith();
- void iLeaveWith();
- void iBeginCatch(QScriptNameIdImpl *id);
- void iEndCatch();
- void iSync();
- void iHalt();
- void iMakeReference();
- void iIn();
- void iNop();
- void iDebugger();
-
-protected:
- virtual bool preVisit(AST::Node *node);
-
- virtual bool visit(AST::ArrayLiteral *node);
- virtual bool visit(AST::ArrayMemberExpression *node);
- virtual bool visit(AST::Expression *node);
- virtual bool visit(AST::BinaryExpression *node);
- virtual bool visit(AST::BreakStatement *node);
- virtual bool visit(AST::CallExpression *node);
- virtual bool visit(AST::ConditionalExpression *node);
- virtual bool visit(AST::ContinueStatement *node);
- virtual bool visit(AST::DeleteExpression *node);
- virtual bool visit(AST::DoWhileStatement *node);
- virtual bool visit(AST::ExpressionStatement *node);
- virtual bool visit(AST::FalseLiteral *node);
- virtual bool visit(AST::FieldMemberExpression *node);
- virtual bool visit(AST::ForEachStatement *node);
- virtual bool visit(AST::LocalForEachStatement *node);
- virtual bool visit(AST::ForStatement *node);
- virtual bool visit(AST::FunctionDeclaration *node);
- virtual bool visit(AST::FunctionExpression *node);
- virtual bool visit(AST::FunctionSourceElement *node);
- virtual bool visit(AST::IdentifierExpression *node);
- virtual bool visit(AST::IfStatement *node);
- virtual bool visit(AST::LabelledStatement *node);
- virtual bool visit(AST::LocalForStatement *node);
- virtual bool visit(AST::NewExpression *node);
- virtual bool visit(AST::NewMemberExpression *node);
- virtual bool visit(AST::NumericLiteral *node);
- virtual bool visit(AST::ObjectLiteral *node);
- virtual bool visit(AST::PostDecrementExpression *node);
- virtual bool visit(AST::PostIncrementExpression *node);
- virtual bool visit(AST::PreDecrementExpression *node);
- virtual bool visit(AST::PreIncrementExpression *node);
- virtual bool visit(AST::RegExpLiteral *node);
- virtual bool visit(AST::ReturnStatement *node);
- virtual bool visit(AST::SourceElements *node);
- virtual bool visit(AST::StatementList *node);
- virtual bool visit(AST::StatementSourceElement *node);
- virtual bool visit(AST::StringLiteral *node);
- virtual bool visit(AST::SwitchStatement *node);
- virtual bool visit(AST::ThisExpression *node);
- virtual bool visit(AST::NullExpression *node);
- virtual bool visit(AST::ThrowStatement *node);
- virtual bool visit(AST::TryStatement *node);
- virtual bool visit(AST::TrueLiteral *node);
- virtual bool visit(AST::VariableStatement *node);
- virtual bool visit(AST::VariableDeclaration *node);
- virtual bool visit(AST::WhileStatement *node);
- virtual bool visit(AST::WithStatement *node);
- virtual bool visit(AST::Block *node);
- virtual bool visit(AST::TypeOfExpression *node);
- virtual bool visit(AST::DebuggerStatement *node);
-
- virtual void endVisit(AST::BreakStatement *node);
- virtual void endVisit(AST::ContinueStatement *node);
- virtual void endVisit(AST::ExpressionStatement *node);
- virtual void endVisit(AST::NotExpression *node);
- virtual void endVisit(AST::ReturnStatement *node);
- virtual void endVisit(AST::ThrowStatement *node);
- virtual void endVisit(AST::TildeExpression *node);
- virtual void endVisit(AST::UnaryPlusExpression *node);
- virtual void endVisit(AST::UnaryMinusExpression *node);
- virtual void endVisit(AST::VoidExpression *node);
- virtual void endVisit(AST::EmptyStatement *node);
-
- void visitForInternal(AST::Statement *node, AST::ExpressionNode *condition,
- AST::Statement *statement, AST::ExpressionNode *expression);
-
- bool isAssignmentOperator(int op) const;
- int inplaceAssignmentOperator(int op) const;
-
- inline int nextInstructionOffset() const
- { return m_instructions.count(); }
-
- inline void pushInstruction(QScriptInstruction::Operator op)
- {
- pushInstruction(op, QScriptValueImpl(), QScriptValueImpl());
- }
-
- inline void pushInstruction(QScriptInstruction::Operator op,
- const QScriptValueImpl &arg1)
- {
- pushInstruction(op, arg1, QScriptValueImpl());
- }
-
- inline void pushInstruction(QScriptInstruction::Operator op,
- const QScriptValueImpl &arg1,
- const QScriptValueImpl &arg2)
- {
- QScriptInstruction i;
- i.op = op;
- i.operand[0] = arg1;
- i.operand[1] = arg2;
- m_instructions.append(i);
- }
-
- inline bool generateReferences(bool b)
- {
- bool was = m_generateReferences;
- m_generateReferences = b;
- return was;
- }
-
- inline bool generateFastArgumentLookup(bool b)
- {
- bool was = m_generateFastArgumentLookup;
- m_generateFastArgumentLookup= b;
- return was;
- }
-
- inline bool iterationStatement(bool b)
- {
- bool was = m_iterationStatement;
- m_iterationStatement = b;
- return was;
- }
-
- inline bool switchStatement(bool b)
- {
- bool was = m_switchStatement;
- m_switchStatement = b;
- return was;
- }
-
- inline bool changeParseStatements(bool b)
- {
- bool was = m_parseStatements;
- m_parseStatements = b;
- return was;
- }
-
- inline bool withStatement(bool b)
- {
- bool was = m_withStatement;
- m_withStatement = b;
- return was;
- }
-
- inline bool generateLeaveOnBreak(bool b)
- {
- bool was = m_generateLeaveWithOnBreak;
- m_generateLeaveWithOnBreak = b;
- return was;
- }
-
- void patchInstruction(int index, int offset);
-
-private:
- QScriptEnginePrivate *m_eng;
-
- uint m_generateReferences: 1;
- uint m_iterationStatement: 1;
- uint m_switchStatement: 1;
- uint m_withStatement: 1;
- uint m_generateLeaveWithOnBreak: 1;
- uint m_generateFastArgumentLookup: 1;
- uint m_parseStatements: 1;
- uint m_pad: 25;
-
- bool m_topLevelCompiler; // bit
- QVector<QScriptInstruction> m_instructions;
- QVector<ExceptionHandlerDescriptor> m_exceptionHandlers;
- QList<QScriptNameIdImpl *> m_formals;
-
- struct Loop {
- Loop(QScriptNameIdImpl *n = 0):
- name(n) {}
-
- QScriptNameIdImpl *name;
- Label breakLabel;
- Label continueLabel;
- };
-
- inline Loop *changeActiveLoop(Loop *activeLoop)
- {
- Loop *was = m_activeLoop;
- m_activeLoop = activeLoop;
- return was;
- }
-
- Loop *findLoop(QScriptNameIdImpl *name = 0);
-
- Loop *m_activeLoop;
- QMap<AST::Statement*, Loop> m_loops;
- CompilationUnit m_compilationUnit;
-};
-
-} // namespace QScript
-
-#endif // QT_NO_SCRIPT
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptcontext_p.cpp b/src/script/qscriptcontext_p.cpp
deleted file mode 100644
index f19ba9c..0000000
--- a/src/script/qscriptcontext_p.cpp
+++ /dev/null
@@ -1,2598 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/QtDebug>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptcontext_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptprettypretty_p.h"
-#include "qscriptast_p.h"
-#include "qscriptnodepool_p.h"
-#include "qscriptcompiler_p.h"
-#include "qscriptextenumeration_p.h"
-
-#include <math.h> // floor & friends...
-
-QT_BEGIN_NAMESPACE
-
-#define Q_SCRIPT_NO_PRINT_GENERATED_CODE
-
-#define Q_SCRIPT_NO_JOINED_FUNCTION
-
-#define CHECK_TEMPSTACK(needed) do { \
- if (stackPtr + needed >= eng->tempStackEnd) { \
- throwError(QLatin1String("out of memory")); \
- HandleException(); \
- } \
-} while (0)
-
-#ifndef Q_SCRIPT_NO_PRINT_GENERATED_CODE
-static QTextStream qout(stderr, QIODevice::WriteOnly);
-#endif
-
-static inline void qscript_uint_to_string_helper(uint i, QString &s)
-{
- switch (i) {
- case 0: case 1: case 2: case 3: case 4:
- case 5: case 6: case 7: case 8: case 9:
- s += QLatin1Char('0' + i);
- break;
-
- default:
- qscript_uint_to_string_helper(i / 10, s);
- s += QLatin1Char('0' + (i % 10));
- }
-}
-
-static inline void qscript_uint_to_string(qsreal i, QString &s)
-{
- if ((i < 0) || (i > 0xFFFFFFFF))
- return; // nothing to do
-
- qsreal x = ::fmod(i, 10);
-
- if (x != 0.0 && x != 1.0
- && x != 2.0 && x != 3.0
- && x != 4.0 && x != 5.0
- && x != 6.0 && x != 7.0
- && x != 8.0 && x != 9.0)
- return; // nothing to do
-
- qscript_uint_to_string_helper(uint(i), s);
-}
-
-static inline quint32 toArrayIndex(const QScriptValueImpl &v)
-{
- if (v.isNumber()) {
- quint32 ui = v.toUInt32();
- if (qsreal(ui) == v.m_number_value)
- return ui;
- } else if (v.isString()) {
- QByteArray bytes = v.m_string_value->s.toUtf8();
- char *eptr;
- quint32 pos = strtoul(bytes.constData(), &eptr, 10);
- if ((eptr == bytes.constData() + bytes.size())
- && (QByteArray::number(pos) == bytes)) {
- return pos;
- }
- }
- return 0xFFFFFFFF;
-}
-
-#define CREATE_MEMBER(__obj__, __name__, __member__, __flags__) do { \
- (__obj__).createMember(__name__, __member__, __flags__); \
- eng->adjustBytesAllocated(sizeof(QScript::Member) + sizeof(QScriptValueImpl)); \
-} while (0)
-
-#define BEGIN_PREFIX_OPERATOR \
- QScriptValue::ResolveFlags mode; \
- mode = QScriptValue::ResolveFlags(stackPtr[0].m_int_value) \
- | QScriptValue::ResolvePrototype; \
- --stackPtr; \
- QScriptValueImpl object = eng->toObject(stackPtr[-1]); \
- if (!object.isObject()) { \
- stackPtr -= 2; \
- throwTypeError(QLatin1String("not an object")); \
- HandleException(); \
- } \
- QScriptNameIdImpl *memberName = 0; \
- if (stackPtr[0].isString() && stackPtr[0].m_string_value->unique) \
- memberName = stackPtr[0].m_string_value; \
- else \
- memberName = eng->nameId(stackPtr[0].toString(), /*persistent=*/false); \
- QScript::Member member; \
- QScriptValueImpl base; \
- QScriptValueImpl value; \
- QScriptValueImpl getter; \
- QScriptValueImpl setter; \
- const bool isMemberAssignment = (object.m_object_value != m_scopeChain.m_object_value); \
- if (object.resolve(memberName, &member, &base, mode, QScript::ReadWrite)) { \
- base.get(member, &value); \
- if (hasUncaughtException()) { \
- stackPtr -= 2; \
- HandleException(); \
- } else if (member.isGetterOrSetter()) { \
- if (member.isGetter()) { \
- getter = value; \
- if (!member.isSetter() && !base.m_object_value->findSetter(&member)) { \
- stackPtr -= 2; \
- throwError(QLatin1String("No setter defined")); \
- HandleException(); \
- } \
- base.get(member, &setter); \
- } else { \
- setter = value; \
- QScript::Member tmp = member; \
- if (!base.m_object_value->findGetter(&member)) { \
- stackPtr -= 2; \
- throwError(QLatin1String("No getter defined")); \
- HandleException(); \
- } \
- base.get(member, &getter); \
- member = tmp; \
- } \
- value = getter.call(object); \
- if (hasUncaughtException()) { \
- stackPtr -= 2; \
- Done(); \
- } \
- } \
- } else if (!isMemberAssignment) { \
- stackPtr -= 2; \
- throwNotDefined(memberName); \
- HandleException(); \
- } else { \
- base = object; \
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0); \
- value = undefined; \
- }
-
-#define END_PREFIX_OPERATOR \
- if (member.isSetter()) { \
- setter.call(object, QScriptValueImplList() << value); \
- if (hasUncaughtException()) { \
- stackPtr -= 2; \
- Done(); \
- } \
- } else { \
- if (member.isWritable()) { \
- if (isMemberAssignment && (base.m_object_value != object.m_object_value)) { \
- base = object; \
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0); \
- } \
- base.put(member, value); \
- if (hasUncaughtException()) { \
- stackPtr -= 2; \
- HandleException(); \
- } \
- } \
- } \
- *--stackPtr = value; \
- ++iPtr;
-
-#define BEGIN_INPLACE_OPERATOR \
- if (! stackPtr[-1].isReference()) { \
- stackPtr -= 2; \
- throwSyntaxError(QLatin1String("invalid assignment lvalue")); \
- HandleException(); \
- } \
- QScriptValue::ResolveFlags mode; \
- mode = QScriptValue::ResolveFlags(stackPtr[-1].m_int_value) \
- | QScriptValue::ResolvePrototype; \
- QScriptValueImpl object = eng->toObject(stackPtr[-3]); \
- if (! object.isValid()) { \
- stackPtr -= 4; \
- throwTypeError(QLatin1String("not an object")); \
- HandleException(); \
- } \
- QScriptNameIdImpl *memberName = 0; \
- if (stackPtr[-2].isString() && stackPtr[-2].m_string_value->unique) \
- memberName = stackPtr[-2].m_string_value; \
- else \
- memberName = eng->nameId(stackPtr[-2].toString(), /*persistent=*/false); \
- QScriptValueImpl lhs; \
- QScriptValueImpl base; \
- QScript::Member member; \
- QScriptValueImpl getter; \
- QScriptValueImpl setter; \
- const bool isMemberAssignment = (object.m_object_value != m_scopeChain.m_object_value); \
- if (object.resolve(memberName, &member, &base, mode, QScript::ReadWrite)) { \
- base.get(member, &lhs); \
- if (hasUncaughtException()) { \
- stackPtr -= 4; \
- HandleException(); \
- } else if (member.isGetterOrSetter()) { \
- if (member.isGetter()) { \
- getter = lhs; \
- if (!member.isSetter() && !base.m_object_value->findSetter(&member)) { \
- stackPtr -= 4; \
- throwError(QLatin1String("No setter defined")); \
- HandleException(); \
- } \
- base.get(member, &setter); \
- } else { \
- setter = lhs; \
- QScript::Member tmp = member; \
- if (!base.m_object_value->findGetter(&member)) { \
- stackPtr -= 4; \
- throwError(QLatin1String("No getter defined")); \
- HandleException(); \
- } \
- base.get(member, &getter); \
- member = tmp; \
- } \
- lhs = getter.call(object); \
- if (hasUncaughtException()) { \
- stackPtr -= 4; \
- Done(); \
- } \
- } \
- } else if (!isMemberAssignment) { \
- stackPtr -= 4; \
- throwNotDefined(memberName); \
- HandleException(); \
- } else { \
- base = object; \
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0); \
- lhs = undefined; \
- } \
- QScriptValueImpl rhs = stackPtr[0];
-
-#define END_INPLACE_OPERATOR \
- if (member.isSetter()) { \
- setter.call(object, QScriptValueImplList() << *stackPtr); \
- if (hasUncaughtException()) { \
- stackPtr -= 1; \
- Done(); \
- } \
- } else { \
- if (member.isWritable()) { \
- if (isMemberAssignment && (base.m_object_value != object.m_object_value)) { \
- base = object; \
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0); \
- } \
- base.put(member, *stackPtr); \
- if (hasUncaughtException()) { \
- stackPtr -= 1; \
- HandleException(); \
- } \
- } \
- } \
- ++iPtr;
-
-namespace QScript {
-
-void ScriptFunction::execute(QScriptContextPrivate *context)
-{
- if (! m_compiledCode) {
- QScriptEnginePrivate *eng = context->engine();
- Compiler compiler(eng);
-
- CompilationUnit unit = compiler.compile(m_definition->body, formals);
- if (! unit.isValid()) {
- context->throwError(unit.errorMessage());
- return;
- }
-
- m_compiledCode = m_astPool->createCompiledCode(m_definition->body, unit);
- }
-
- context->execute(m_compiledCode);
-}
-
-QString ScriptFunction::toString(QScriptContextPrivate *) const
-{
- QString str;
- QTextStream out(&str, QIODevice::WriteOnly);
- PrettyPretty pp(out);
- pp(m_definition, /*indent=*/ 0);
- return str;
-}
-
-QString ScriptFunction::fileName() const
-{
- return m_astPool->fileName();
-}
-
-QString ScriptFunction::functionName() const
-{
- if (!m_definition->name)
- return QString();
- return m_definition->name->s;
-}
-
-int ScriptFunction::startLineNumber() const
-{
- return m_definition->startLine;
-}
-
-int ScriptFunction::endLineNumber() const
-{
- return m_definition->endLine;
-}
-
-} // namespace QScript
-
-/*!
- \internal
-
- Resolves and gets the value specified by \a stackPtr.
- stackPtr[0] contains the member specifier, stackPtr[-1] contains the object.
- If the member can be resolved, sets \a value to the value of that member,
- otherwise returns false.
-*/
-bool QScriptContextPrivate::resolveField(QScriptEnginePrivate *eng,
- QScriptValueImpl *stackPtr,
- QScriptValueImpl *value)
-{
- const QScriptValueImpl &m = stackPtr[0];
- QScriptValueImpl &object = stackPtr[-1];
-
- if (! object.isObject())
- object = eng->toObject(object);
-
- if (! object.isValid())
- return false;
-
- if (QScript::Ecma::Array::Instance *arrayInstance = eng->arrayConstructor->get(object)) {
- quint32 pos = toArrayIndex(m);
- if (pos != 0xFFFFFFFF) {
- *value = arrayInstance->value.at(pos);
-
- if (! value->isValid())
- *value = eng->undefinedValue();
-
- return true;
- }
- }
-
- QScriptNameIdImpl *nameId = m.isString() ? m.m_string_value : 0;
-
- if (! nameId || ! nameId->unique)
- nameId = eng->nameId(QScriptEnginePrivate::convertToNativeString(m), /*persistent=*/false); // ### slow!
-
- QScript::Member member;
- QScriptValueImpl base;
-
- if (! object.resolve(nameId, &member, &base, QScriptValue::ResolveFull, QScript::Read)) // ### ...
- return false;
-
- if (QScriptEnginePrivate::strictlyEquals(base, eng->m_globalObject))
- stackPtr[-1] = base;
- else if (object.classInfo() == eng->m_class_with)
- stackPtr[-1] = object.prototype();
-
- base.get(member, value);
-
- if (member.isGetterOrSetter()) {
- // call the getter function
- QScriptValueImpl getter;
- if (member.isGetter()) {
- getter = *value;
- } else {
- if (!base.m_object_value->findGetter(&member)) {
- *value = eng->undefinedValue();
- return true;
- }
- base.get(member, &getter);
- }
- *value = getter.call(object);
- }
-
- return true;
-}
-
-void QScriptContextPrivate::execute(QScript::Code *code)
-{
- int oldCurrentLine = currentLine;
- int oldCurrentColumn = currentColumn;
- QScript::Code *oldCode = m_code;
- m_code = code;
-
-#ifndef Q_SCRIPT_NO_PRINT_GENERATED_CODE
- qout << QLatin1String("function:") << endl;
- for (QScriptInstruction *current = code->firstInstruction; current != code->lastInstruction; ++current) {
- qout << int(current - code->firstInstruction) << QLatin1String(":\t");
- current->print(qout);
- qout << endl;
- }
- qout << endl;
-#endif
-
- QScriptEnginePrivate *eng = engine();
-
- bool wasEvaluating = eng->m_evaluating;
- if (!wasEvaluating) {
- eng->setupProcessEvents();
- eng->resetAbortFlag();
- }
- eng->m_evaluating = true;
-
- // set up the temp stack
- if (! tempStack)
- stackPtr = tempStack = eng->tempStackBegin;
-
- QScriptValueImpl undefined(eng->undefinedValue());
-
- catching = false;
- m_state = QScriptContext::NormalState;
- m_result = undefined;
- firstInstruction = code->firstInstruction;
- lastInstruction = code->lastInstruction;
- iPtr = code->firstInstruction;
-
- if (!m_scopeChain.isValid())
- m_scopeChain = m_activation;
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng->notifyFunctionEntry(this);
-#endif
-
-#ifndef Q_SCRIPT_DIRECT_CODE
-
-# define I(opc) case QScriptInstruction::OP_##opc
-# define Next() goto Lfetch
-# define Done() goto Ldone
-# define HandleException() goto Lhandle_exception
-# define Abort() goto Labort
-
-Lfetch:
-
-
-#else
-
-# define I(opc) qscript_execute_##opc
-# define Next() goto *iPtr->code
-# define Done() goto Ldone
-# define HandleException() goto Lhandle_exception
-# define Abort() goto Labort
-
- static void * const jump_table[] = {
-
-# define Q_SCRIPT_DEFINE_OPERATOR(op) &&I(op),
-# include "instruction.table"
-# undef Q_SCRIPT_DEFINE_OPERATOR
- }; // jump_table
-
-
- if (!code->optimized) {
- for (QScriptInstruction *current = code->firstInstruction; current != code->lastInstruction; ++current) {
- current->code = jump_table[current->op];
- }
-
- code->optimized = true;
- }
-
-#endif
-Ltop:
-
-#ifndef Q_SCRIPT_DIRECT_CODE
- switch (iPtr->op) {
-#else
- goto *iPtr->code;
-#endif
-
- I(Nop):
- {
- ++iPtr;
- } Next();
-
- I(LoadUndefined):
- {
- CHECK_TEMPSTACK(1);
- *(++stackPtr) = undefined;
- ++iPtr;
- } Next();
-
- I(LoadTrue):
- {
- CHECK_TEMPSTACK(1);
- *(++stackPtr) = QScriptValueImpl(true);
- ++iPtr;
- } Next();
-
- I(LoadFalse):
- {
- CHECK_TEMPSTACK(1);
- *(++stackPtr) = QScriptValueImpl(false);
- ++iPtr;
- } Next();
-
- I(LoadThis):
- {
- CHECK_TEMPSTACK(1);
- Q_ASSERT(m_thisObject.isObject());
- *++stackPtr = m_thisObject;
- ++iPtr;
- } Next();
-
- I(LoadActivation):
- {
- CHECK_TEMPSTACK(1);
- *++stackPtr = m_activation;
- ++iPtr;
- } Next();
-
- I(LoadNull):
- {
- CHECK_TEMPSTACK(1);
- *(++stackPtr) = eng->nullValue();
- ++iPtr;
- } Next();
-
- I(LoadNumber):
- {
- CHECK_TEMPSTACK(1);
- *++stackPtr = iPtr->operand[0];
- ++iPtr;
- } Next();
-
-
- I(LoadString):
- {
- CHECK_TEMPSTACK(1);
- *++stackPtr = iPtr->operand[0];
- ++iPtr;
- } Next();
-
- I(NewString):
- {
- CHECK_TEMPSTACK(1);
- eng->newNameId(++stackPtr, iPtr->operand[0].m_string_value);
- ++iPtr;
- } Next();
-
- I(Duplicate):
- {
- CHECK_TEMPSTACK(1);
- ++stackPtr;
- *stackPtr = stackPtr[-1];
- ++iPtr;
- } Next();
-
- I(Swap):
- {
- QScriptValueImpl tmp = stackPtr[0];
- *stackPtr = stackPtr[-1];
- stackPtr[-1] = tmp;
- ++iPtr;
- } Next();
-
-
- I(Receive):
- {
- int n = iPtr->operand[0].m_int_value;
-
- if (n >= argc) {
- throwError(QLatin1String("invalid argument"));
- HandleException();
- }
-
- CHECK_TEMPSTACK(1);
- *++stackPtr = argument(n);
- ++iPtr;
- } Next();
-
- I(Fetch):
- {
- CHECK_TEMPSTACK(1);
-
- QScriptNameIdImpl *memberName = iPtr->operand[0].m_string_value;
-
- QScriptValueImpl base;
- QScript::Member member;
-
- QScriptObject *instance = m_scopeChain.m_object_value;
- if (instance->findMember(memberName, &member)) {
- instance->get(member, ++stackPtr);
- base = m_scopeChain;
- } else {
- if (m_scopeChain.resolve_helper(memberName, &member, &base, QScriptValue::ResolveFull, QScript::Read)) {
- base.get(member, ++stackPtr);
- if (hasUncaughtException()) {
- stackPtr -= 1;
- HandleException();
- }
- } else {
- throwNotDefined(memberName);
- HandleException();
- }
- }
- if (member.isGetterOrSetter()) {
- // locate the getter function
- QScriptValueImpl getter;
- if (member.isGetter()) {
- getter = *stackPtr;
- } else {
- if (!base.m_object_value->findGetter(&member)) {
- stackPtr -= 1;
- throwError(QLatin1String("No getter defined"));
- HandleException();
- }
- base.get(member, &getter);
- }
- // decide the this-object. This is the object that actually
- // has the getter (in its prototype chain).
- QScriptValueImpl object = m_scopeChain;
- while (!object.resolve(memberName, &member, &base, QScriptValue::ResolvePrototype, QScript::Read))
- object = object.scope();
- if (object.classInfo() == eng->m_class_with)
- object = object.prototype();
-
- *stackPtr = getter.call(object);
- if (hasUncaughtException()) {
- stackPtr -= 1;
- Done();
- }
- }
- ++iPtr;
- } Next();
-
- I(Resolve):
- {
- Q_ASSERT(iPtr->operand[0].isString());
-
- CHECK_TEMPSTACK(2);
- *++stackPtr = m_scopeChain;
- *++stackPtr = iPtr->operand[0];
- eng->newReference(++stackPtr, QScriptValue::ResolveScope);
- ++iPtr;
- } Next();
-
- I(PutField):
- {
- Q_ASSERT(stackPtr[-1].isReference());
-
- const QScriptValueImpl &object = stackPtr[-3];
- QScriptNameIdImpl *memberName = stackPtr[-2].m_string_value;
- const QScriptValueImpl &value = stackPtr[0];
-
- QScript::Member member;
- QScriptValueImpl base;
-
- if (! object.resolve(memberName, &member, &base, QScriptValue::ResolveLocal, QScript::Write)) {
- base = object;
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0);
- }
-
- base.put(member, value);
- stackPtr -= 4;
- if (hasUncaughtException())
- HandleException();
- ++iPtr;
- } Next();
-
- I(Call):
- {
- int argc = iPtr->operand[0].m_int_value;
- QScriptValueImpl *argp = stackPtr - argc;
-
- QScriptValueImpl base;
- QScriptValueImpl callee;
-
- bool isReference = argp[0].isReference();
-
- if (! isReference) { // we have a value
- base = eng->m_globalObject;
- callee = argp[0];
- } else if (resolveField(eng, &argp[-1], &callee)) {
- if (hasUncaughtException()) {
- stackPtr = argp - 3;
- HandleException();
- }
- base = argp[-2];
- } else {
- QScriptValueImpl member = argp[-1];
- stackPtr = argp - 1;
- Q_ASSERT(isReference);
- stackPtr -= 2;
-
- if (member.isString())
- throwNotDefined(member.toString());
- else
- throwNotDefined(QLatin1String("function"));
- HandleException();
- }
-
- Q_ASSERT(base.isValid());
- Q_ASSERT(callee.isValid());
-
- QScriptFunction *function = QScriptEnginePrivate::convertToNativeFunction(callee);
- if (! function) {
- QScriptValueImpl member = argp[-1];
- QString message;
- if (member.isString()) {
- message = QString::fromLatin1("%0 is not a function")
- .arg(member.toString());
- } else {
- message = QLatin1String("not a function");
- }
- throwTypeError(message);
- HandleException();
- }
-
- if (++eng->m_callDepth == eng->m_maxCallDepth) {
- throwError(QLatin1String("call stack overflow"));
- HandleException();
- }
-
- QScriptContextPrivate *nested_data = eng->pushContext();
- nested_data->m_thisObject = base;
- nested_data->m_callee = callee;
-
- // create the activation
- eng->newActivation(&nested_data->m_activation);
- QScriptObject *activation_data = nested_data->m_activation.m_object_value;
-
- int formalCount = function->formals.count();
- int mx = qMax(formalCount, argc);
- activation_data->m_members.resize(mx);
- activation_data->m_values.resize(mx);
- for (int i = 0; i < mx; ++i) {
- QScriptNameIdImpl *nameId = 0;
- if (i < formalCount)
- nameId = function->formals.at(i);
-
- activation_data->m_members[i].object(nameId, i,
- QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration);
- activation_data->m_values[i] = (i < argc) ? argp[i + 1] : undefined;
- }
-
- nested_data->argc = argc;
- if (callee.m_object_value->m_scope.isValid())
- activation_data->m_scope = callee.m_object_value->m_scope;
- else
- activation_data->m_scope = eng->m_globalObject;
- nested_data->tempStack = stackPtr;
- nested_data->args = &argp[1];
-
- function->execute(nested_data);
-
- --eng->m_callDepth;
-
- stackPtr = argp - 1;
- if (isReference)
- stackPtr -= 2;
-
- if (nested_data->m_state == QScriptContext::ExceptionState) {
- eng->popContext();
- if (eng->shouldAbort())
- Abort();
- else
- Done();
- }
-
- CHECK_TEMPSTACK(1);
- *++stackPtr = nested_data->m_result;
-
- eng->popContext();
-
- if (eng->shouldAbort())
- Abort();
-
- if (eng->m_processEventsInterval > 0)
- eng->processEvents();
-
- ++iPtr;
- } Next();
-
-
- I(NewArray):
- {
- CHECK_TEMPSTACK(1);
- eng->arrayConstructor->newArray(++stackPtr, QScript::Array(eng));
- ++iPtr;
- } Next();
-
- I(NewRegExp):
- {
- CHECK_TEMPSTACK(1);
-
- QString pattern = eng->toString(iPtr->operand[0].m_string_value);
-#ifndef QT_NO_REGEXP
- QString literal = pattern;
-#endif
- int flags = 0;
- if (iPtr->operand[1].isValid()) {
- flags = iPtr->operand[1].m_int_value;
-#ifndef QT_NO_REGEXP
- if (flags != 0) {
- literal += QLatin1Char('/');
- literal += QString::number(flags);
- }
-#endif
- }
-
-#ifndef QT_NO_REGEXP
- QRegExp rx;
- // lazy compilation of regexp literals
- QHash<QString, QRegExp>::const_iterator it;
- it = eng->m_regExpLiterals.constFind(literal);
- if (it == eng->m_regExpLiterals.constEnd()) {
- rx = QScript::Ecma::RegExp::toRegExp(pattern, flags);
- eng->m_regExpLiterals.insert(literal, rx);
- } else {
- rx = *it;
- }
- eng->regexpConstructor->newRegExp(++stackPtr, rx, flags);
-#else
- eng->regexpConstructor->newRegExp(++stackPtr, pattern, flags);
-#endif
- ++iPtr;
- } Next();
-
- I(NewObject):
- {
- CHECK_TEMPSTACK(1);
- eng->objectConstructor->newObject(++stackPtr);
- ++iPtr;
- } Next();
-
- I(New):
- {
- int argc = iPtr->operand[0].m_int_value;
- QScriptValueImpl *argp = stackPtr - argc;
-
- // QScriptValueImpl base;
- QScriptValueImpl callee;
-
- bool isReference = argp[0].isReference();
-
- if (! isReference) { // we have a value
- // base = eng->globalObject;
- callee = argp[0];
- } else if (resolveField(eng, &argp[-1], &callee)) {
- // base = argp[-2];
- if (hasUncaughtException()) {
- stackPtr = argp - 3;
- HandleException();
- }
- } else {
- QScriptValueImpl member = argp[-1];
- stackPtr = argp - 1;
- Q_ASSERT(isReference);
- stackPtr -= 2;
-
- if (member.isString())
- throwNotDefined(member.toString());
- else
- throwNotDefined(QLatin1String("constructor"));
- HandleException();
- }
-
- // Q_ASSERT(base.isValid());
- Q_ASSERT(callee.isValid());
-
- QScriptFunction *function = QScriptEnginePrivate::convertToNativeFunction(callee);
- if (! function) {
- QScriptValueImpl member = argp[-1];
- QString message;
- if (member.isString()) {
- message = QString::fromLatin1("%0 is not a constructor")
- .arg(member.toString());
- } else {
- message = QLatin1String("not a constructor");
- }
- throwTypeError(message);
- HandleException();
- }
-
- if (++eng->m_callDepth == eng->m_maxCallDepth) {
- throwError(QLatin1String("call stack overflow"));
- HandleException();
- }
-
- QScriptContextPrivate *nested_data = eng->pushContext();
- nested_data->m_callee = callee;
- nested_data->m_calledAsConstructor = true;
-
- // create the activation
- eng->newActivation(&nested_data->m_activation);
- QScriptObject *activation_data = nested_data->m_activation.m_object_value;
-
- int formalCount = function->formals.count();
- int mx = qMax(formalCount, argc);
- activation_data->m_members.resize(mx);
- activation_data->m_values.resize(mx);
- for (int i = 0; i < mx; ++i) {
- QScriptNameIdImpl *nameId = 0;
- if (i < formalCount)
- nameId = function->formals.at(i);
-
- activation_data->m_members[i].object(nameId, i,
- QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration);
- activation_data->m_values[i] = (i < argc) ? argp[i + 1] : undefined;
- }
-
- eng->objectConstructor->newObject(&nested_data->m_thisObject);
- nested_data->argc = argc;
- if (callee.m_object_value->m_scope.isValid())
- activation_data->m_scope = callee.m_object_value->m_scope;
- else
- activation_data->m_scope = eng->m_globalObject;
- nested_data->tempStack = stackPtr;
- nested_data->args = &argp[1];
- nested_data->m_result = undefined;
-
- QScriptObject *instance = nested_data->m_thisObject.m_object_value;
-
- // set [[prototype]]
- QScriptValueImpl dummy;
- QScript::Member proto;
- if (callee.resolve(eng->idTable()->id_prototype, &proto, &dummy, QScriptValue::ResolveLocal, QScript::Read))
- callee.get(proto, &instance->m_prototype);
- if (!instance->m_prototype.isObject())
- instance->m_prototype = eng->objectConstructor->publicPrototype;
-
- function->execute(nested_data);
-
- --eng->m_callDepth;
-
- stackPtr = argp - 1;
- if (isReference)
- stackPtr -= 2;
-
- if (! nested_data->m_result.isValid())
- nested_data->m_result = undefined;
- else if (! nested_data->m_result.isObject())
- nested_data->m_result = nested_data->m_thisObject;
-
- if (nested_data->m_state == QScriptContext::ExceptionState) {
- eng->popContext();
- if (eng->shouldAbort())
- Abort();
- else
- Done();
- }
-
- CHECK_TEMPSTACK(1);
-
- *++stackPtr = nested_data->m_result;
-
- eng->popContext();
-
- if (eng->shouldAbort())
- Abort();
-
- if (eng->m_processEventsInterval > 0)
- eng->processEvents();
-
- ++iPtr;
- } Next();
-
- I(FetchField):
- {
- QScriptValueImpl object = eng->toObject(stackPtr[-1]);
- if (! object.isValid()) {
- stackPtr -= 2;
- throwTypeError(QLatin1String("not an object"));
- HandleException();
- }
-
- QScriptValueImpl m = stackPtr[0];
-
- QScript::Ecma::Array::Instance *arrayInstance = 0;
- if (object.classInfo() == eng->arrayConstructor->classInfo())
- arrayInstance = static_cast<QScript::Ecma::Array::Instance *> (object.m_object_value->m_data);
-
- if (arrayInstance) {
- quint32 pos = toArrayIndex(m);
- if (pos != 0xFFFFFFFF) {
- QScriptValueImpl val = arrayInstance->value.at(pos);
- if (val.isValid()) {
- *--stackPtr = val;
- ++iPtr;
- Next();
- }
- }
- }
-
- QScriptNameIdImpl *nameId = m.isString() ? m.m_string_value : 0;
-
- if (! nameId || ! nameId->unique) {
- QString str;
-
- if (m.isNumber())
- qscript_uint_to_string(m.m_number_value, str);
-
- if (str.isEmpty())
- str = QScriptEnginePrivate::convertToNativeString(m);
-
- nameId = eng->nameId(str, /*persistent=*/false);
- }
-
- QScript::Member member;
- QScriptValueImpl base;
-
- if (object.resolve(nameId, &member, &base, QScriptValue::ResolvePrototype, QScript::Read)) {
- base.get(member, --stackPtr);
- if (hasUncaughtException()) {
- stackPtr -= 1;
- HandleException();
- } else if (member.isGetterOrSetter()) {
- // call the getter function
- QScriptValueImpl getter;
- if (member.isGetter()) {
- getter = *stackPtr;
- } else {
- if (!base.m_object_value->findGetter(&member)) {
- stackPtr -= 1;
- throwError(QLatin1String("No getter defined"));
- HandleException();
- }
- base.get(member, &getter);
- }
- *stackPtr = getter.call(object);
- if (hasUncaughtException()) {
- stackPtr -= 1;
- Done();
- }
- }
- } else {
- *(--stackPtr) = undefined;
- }
-
- ++iPtr;
- } Next();
-
- I(LazyArguments):
- {
- QScript::Member member;
- QScriptValueImpl base;
- QScriptNameIdImpl *arguments = eng->idTable()->id_arguments;
- if (!m_activation.resolve(arguments, &member, &base, QScriptValue::ResolveLocal, QScript::Read)) {
- CREATE_MEMBER(m_activation, arguments, &member, QScriptValue::Undeletable);
- if (!m_arguments.isValid()) {
- if (eng->strictlyEquals(m_activation, eng->globalObject()))
- m_arguments = undefined;
- else
- eng->newArguments(&m_arguments, m_activation, argc, m_callee);
- }
- m_activation.put(member, m_arguments);
- }
- ++iPtr;
- } Next();
-
- I(DeclareLocal):
- {
- QScriptValueImpl &act = m_activation;
-
- QScriptNameIdImpl *memberName = iPtr->operand[0].m_string_value;
- bool readOnly = iPtr->operand[1].m_int_value != 0;
- QScript::Member member;
- QScriptValueImpl object;
-
- if (! act.resolve(memberName, &member, &object, QScriptValue::ResolveLocal, QScript::ReadWrite)) {
- uint flags = QScriptValue::Undeletable;
- if (readOnly)
- flags |= QScript::Member::UninitializedConst | QScriptValue::ReadOnly;
- CREATE_MEMBER(act, memberName, &member, flags);
- act.put(member, undefined);
- }
- ++iPtr;
- } Next();
-
- I(Assign):
- {
- if (! stackPtr[-1].isReference()) {
- stackPtr -= 2;
- throwSyntaxError(QLatin1String("invalid assignment lvalue"));
- HandleException();
- }
-
- QScriptValue::ResolveFlags mode;
- mode = QScriptValue::ResolveFlags(stackPtr[-1].m_int_value)
- | QScriptValue::ResolvePrototype;
-
- QScriptValueImpl object = eng->toObject(stackPtr[-3]);
- if (! object.isValid()) {
- stackPtr -= 4;
- throwTypeError(QLatin1String("invalid assignment lvalue"));
- HandleException();
- }
-
- QScriptValueImpl m = stackPtr[-2];
- QScriptValueImpl value = stackPtr[0];
-
- quint32 pos = 0xFFFFFFFF;
-
- QScript::Ecma::Array::Instance *arrayInstance = eng->arrayConstructor->get(object);
- if (arrayInstance)
- pos = toArrayIndex(m);
-
- stackPtr -= 3;
-
- if (pos != 0xFFFFFFFF)
- arrayInstance->value.assign(pos, value);
-
- else {
- QScriptNameIdImpl *memberName;
-
- if (m.isString() && m.m_string_value->unique)
- memberName = m.m_string_value;
- else
- memberName = eng->nameId(QScriptEnginePrivate::convertToNativeString(m), /*persistent=*/false);
-
- QScriptValueImpl base;
- QScript::Member member;
-
- const bool isMemberAssignment = (object.m_object_value != m_scopeChain.m_object_value);
- if (! object.resolve(memberName, &member, &base, mode, QScript::Write)) {
- if (isMemberAssignment)
- base = object;
- else
- base = eng->m_globalObject;
-
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0);
- }
-
- if (value.isString() && ! value.m_string_value->unique)
- eng->newNameId(&value, value.m_string_value->s);
-
- if (member.isGetterOrSetter()) {
- // find and call setter(value)
- QScriptValueImpl setter;
- if (!member.isSetter()) {
- if (!base.m_object_value->findSetter(&member)) {
- stackPtr -= 1;
- throwError(QLatin1String("no setter defined"));
- HandleException();
- }
- }
- base.get(member, &setter);
-
- if (!isMemberAssignment) {
- // decide the this-object. This is the object that actually
- // has the setter (in its prototype chain).
- while (!object.resolve(memberName, &member, &base, QScriptValue::ResolvePrototype, QScript::Write))
- object = object.scope();
- if (object.classInfo() == eng->m_class_with)
- object = object.prototype();
- }
-
- value = setter.call(object, QScriptValueImplList() << value);
- if (hasUncaughtException()) {
- stackPtr -= 1;
- Done();
- }
- } else {
- if (object.classInfo() == eng->m_class_with)
- object = object.prototype();
-
- if (member.isWritable()) {
- if (isMemberAssignment && (base.m_object_value != object.m_object_value)) {
- base = object;
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0);
- }
- base.put(member, value);
- } else if (member.isUninitializedConst()) {
- base.put(member, value);
- if (member.isObjectProperty()) {
- base.m_object_value->m_members[member.id()]
- .unsetFlags(QScript::Member::UninitializedConst);
- }
- }
- if (hasUncaughtException()) {
- stackPtr -= 1;
- HandleException();
- }
- }
- }
-
- *stackPtr = value;
- ++iPtr;
- } Next();
-
- I(BitAnd):
- {
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]);
- *(--stackPtr) = QScriptValueImpl(v1 & v2);
- ++iPtr;
- } Next();
-
- I(BitOr):
- {
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]);
- *(--stackPtr) = QScriptValueImpl(v1 | v2);
- ++iPtr;
- } Next();
-
- I(BitXor):
- {
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]);
- *(--stackPtr) = QScriptValueImpl(v1 ^ v2);
- ++iPtr;
- } Next();
-
- I(BitNot):
- {
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]);
- *stackPtr = QScriptValueImpl(~v1);
- ++iPtr;
- } Next();
-
- I(Not):
- {
- bool v1 = QScriptEnginePrivate::convertToNativeBoolean(stackPtr[0]);
- *stackPtr = QScriptValueImpl(!v1);
- ++iPtr;
- } Next();
-
- I(LeftShift):
- {
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]) & 0x1f;
- *(--stackPtr) = QScriptValueImpl(v1 << v2);
- ++iPtr;
- } Next();
-
- I(Mod):
- {
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[-1]);
- qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[0]);
-
- *(--stackPtr) = QScriptValueImpl(::fmod(v1, v2));
- ++iPtr;
- } Next();
-
- I(RightShift):
- {
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]);
- quint32 v2 = QScriptEnginePrivate::toUint32 (eng->convertToNativeDouble(stackPtr[0])) & 0x1f;
- *(--stackPtr) = QScriptValueImpl(v1 >> v2);
- ++iPtr;
- } Next();
-
- I(URightShift):
- {
- quint32 v1 = QScriptEnginePrivate::toUint32 (eng->convertToNativeDouble(stackPtr[-1]));
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]) & 0x1f;
- *(--stackPtr) = QScriptValueImpl(v1 >> v2);
- ++iPtr;
- } Next();
-
- I(InstanceOf):
- {
- QScriptValueImpl object = stackPtr[-1];
- QScriptValueImpl ctor = stackPtr[0];
-
- if (!ctor.isObject() || !ctor.implementsHasInstance()) {
- stackPtr -= 2;
- throwTypeError(QLatin1String("invalid 'instanceof' operand"));
- HandleException();
- }
-
- bool result = ctor.hasInstance(object);
- if (eng->hasUncaughtException()) {
- stackPtr -= 2;
- HandleException();
- }
-
- *(--stackPtr) = QScriptValueImpl(result);
- ++iPtr;
- } Next();
-
- I(In):
- {
- QScriptValueImpl object = stackPtr[0];
- if (!object.isObject()) {
- stackPtr -= 2;
- throwTypeError(QLatin1String("invalid 'in' operand"));
- HandleException();
- }
- QString propertyName = QScriptEnginePrivate::convertToNativeString(stackPtr[-1]);
- bool result = object.property(propertyName, QScriptValue::ResolvePrototype).isValid(); // ### hasProperty()
- *(--stackPtr) = QScriptValueImpl(result);
- ++iPtr;
- } Next();
-
- I(Add):
- {
- QScriptValueImpl lhs = eng->toPrimitive(stackPtr[-1], QScriptValueImpl::NoTypeHint);
- QScriptValueImpl rhs = eng->toPrimitive(stackPtr[0], QScriptValueImpl::NoTypeHint);
-
- if (lhs.isString() || rhs.isString()) {
- QString tmp = QScriptEnginePrivate::convertToNativeString(lhs);
- tmp += QScriptEnginePrivate::convertToNativeString(rhs);
- eng->newString(--stackPtr, tmp);
- } else {
- qsreal tmp = QScriptEnginePrivate::convertToNativeDouble(lhs);
- tmp += QScriptEnginePrivate::convertToNativeDouble(rhs);
- *(--stackPtr) = QScriptValueImpl(tmp);
- }
-
- ++iPtr;
- } Next();
-
- I(Div):
- {
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[-1]);
- qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[0]);
- *(--stackPtr) = QScriptValueImpl(v1 / v2);
- ++iPtr;
- } Next();
-
- I(Equal):
- {
- QScriptValueImpl v1 = stackPtr[-1];
- QScriptValueImpl v2 = stackPtr[0];
- *(--stackPtr) = QScriptValueImpl(eq_cmp(v1, v2));
- ++iPtr;
- } Next();
-
- I(GreatOrEqual):
- {
- QScriptValueImpl v1 = stackPtr[0];
- QScriptValueImpl v2 = stackPtr[-1];
- *(--stackPtr) = QScriptValueImpl(le_cmp(v1, v2));
- ++iPtr;
- } Next();
-
- I(GreatThan):
- {
- QScriptValueImpl v1 = stackPtr[0];
- QScriptValueImpl v2 = stackPtr[-1];
- *(--stackPtr) = QScriptValueImpl(lt_cmp(v1, v2));
- ++iPtr;
- } Next();
-
- I(LessOrEqual):
- {
- QScriptValueImpl v1 = stackPtr[-1];
- QScriptValueImpl v2 = stackPtr[0];
- *(--stackPtr) = QScriptValueImpl(le_cmp(v1, v2));
- ++iPtr;
- } Next();
-
- I(LessThan):
- {
- QScriptValueImpl v1 = stackPtr[-1];
- QScriptValueImpl v2 = stackPtr[0];
- *(--stackPtr) = QScriptValueImpl(lt_cmp(v1, v2));
- ++iPtr;
- } Next();
-
- I(NotEqual):
- {
- QScriptValueImpl v1 = stackPtr[-1];
- QScriptValueImpl v2 = stackPtr[0];
- *(--stackPtr) = QScriptValueImpl(!eq_cmp(v1, v2));
- ++iPtr;
- } Next();
-
- I(Mul):
- {
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[-1]);
- qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[0]);
- *(--stackPtr) = QScriptValueImpl(v1 * v2);
- ++iPtr;
- } Next();
-
- I(StrictEqual):
- {
- QScriptValueImpl v1 = stackPtr[-1];
- QScriptValueImpl v2 = stackPtr[0];
- *(--stackPtr) = strict_eq_cmp(v1, v2);
- ++iPtr;
- } Next();
-
- I(StrictNotEqual):
- {
- QScriptValueImpl v1 = stackPtr[-1];
- QScriptValueImpl v2 = stackPtr[0];
- *(--stackPtr) = ! strict_eq_cmp(v1, v2);
- ++iPtr;
- } Next();
-
- I(Sub):
- {
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[-1]);
- qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[0]);
- *(--stackPtr) = QScriptValueImpl(v1 - v2);
- ++iPtr;
- } Next();
-
- I(UnaryMinus):
- {
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(*stackPtr);
- *stackPtr = QScriptValueImpl(-v1);
- ++iPtr;
- } Next();
-
- I(UnaryPlus):
- {
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(*stackPtr);
- *stackPtr = QScriptValueImpl(+v1);
- ++iPtr;
- } Next();
-
- I(Branch):
- {
- eng->maybeProcessEvents();
- if (hasUncaughtException())
- HandleException();
- if (eng->shouldAbort())
- Abort();
- iPtr += iPtr->operand[0].m_int_value;
- } Next();
-
- I(BranchFalse):
- {
- if (! QScriptEnginePrivate::convertToNativeBoolean(*stackPtr--))
- iPtr += iPtr->operand[0].m_int_value;
- else
- ++iPtr;
- } Next();
-
- I(BranchTrue):
- {
- if (eng->convertToNativeBoolean(*stackPtr--))
- iPtr += iPtr->operand[0].m_int_value;
- else
- ++iPtr;
- } Next();
-
- I(NewClosure):
- {
- CHECK_TEMPSTACK(1);
-
- QScript::AST::FunctionExpression *expr = static_cast<QScript::AST::FunctionExpression *> (iPtr->operand[0].m_ptr_value);
-
-#ifndef Q_SCRIPT_NO_JOINED_FUNCTION
- if (QScript::Code *code = eng->findCode(functionBody)) {
- QScriptValueImpl value = code->value;
-
- if (isValid(value)) {
- QScriptObject *instance = value.m_object_value;
- Q_ASSERT(instance != 0);
-
- if (instance->m_scope.m_object_value == m_scopeChain.m_object_value)
- {
- *++stackPtr = value;
- ++iPtr;
- Next();
- }
- }
- }
-#endif
-
- QScript::ScriptFunction *function = new QScript::ScriptFunction(expr, code->astPool);
-
- // update the formals
- for (QScript::AST::FormalParameterList *it = expr->formals; it != 0; it = it->next) {
- function->formals.append(it->name);
- }
- function->length = function->formals.count();
-
- eng->functionConstructor->newFunction(++stackPtr, function);
-
- QScriptObject *instance = stackPtr->m_object_value;
- // initialize [[scope]]
- instance->m_scope = m_scopeChain;
-
- // create and initialize `prototype'
- QScriptValueImpl proto;
- eng->objectConstructor->newObject(&proto);
-
- QScript::Member member;
- CREATE_MEMBER(proto, eng->idTable()->id_constructor, &member,
- QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration);
- proto.put(member, *stackPtr);
-
- stackPtr->createMember(eng->idTable()->id_prototype, &member,
- QScriptValue::Undeletable);
- stackPtr->put(member, proto);
-
- ++iPtr;
- } Next();
-
- I(Incr):
- {
- if (! stackPtr[0].isReference()) {
- stackPtr -= 1;
- throwSyntaxError(QLatin1String("invalid increment operand"));
- HandleException();
- }
-
- BEGIN_PREFIX_OPERATOR
-
- qsreal x = QScriptEnginePrivate::convertToNativeDouble(value);
- value = QScriptValueImpl(x + 1);
-
- END_PREFIX_OPERATOR
- } Next();
-
- I(Decr):
- {
- if (! stackPtr[0].isReference()) {
- stackPtr -= 1;
- throwSyntaxError(QLatin1String("invalid decrement operand"));
- HandleException();
- }
-
- BEGIN_PREFIX_OPERATOR
-
- qsreal x = QScriptEnginePrivate::convertToNativeDouble(value);
- value = QScriptValueImpl(x - 1);
-
- END_PREFIX_OPERATOR
- } Next();
-
- I(PostIncr):
- {
- if (! stackPtr[0].isReference()) {
- stackPtr -= 1;
- throwSyntaxError(QLatin1String("invalid increment operand"));
- HandleException();
- }
-
- QScriptValue::ResolveFlags mode;
- mode = QScriptValue::ResolveFlags(stackPtr[0].m_int_value)
- | QScriptValue::ResolvePrototype;
-
- --stackPtr;
-
- QScriptValueImpl object = eng->toObject(stackPtr[-1]);
- if (!object.isObject()) {
- stackPtr -= 2;
- throwTypeError(QLatin1String("not an object"));
- HandleException();
- }
-
- QScriptNameIdImpl *memberName = 0;
- if (stackPtr[0].isString() && stackPtr[0].m_string_value->unique)
- memberName = stackPtr[0].m_string_value;
- else
- memberName = eng->nameId(stackPtr[0].toString(), /*persistent=*/false);
-
- QScript::Member member;
- QScriptValueImpl base;
- QScriptValueImpl value;
- QScriptObject *instance = object.m_object_value;
- const bool isMemberAssignment = (instance != m_scopeChain.m_object_value);
- if (instance->findMember(memberName, &member)) {
- if (!member.isGetterOrSetter()) {
- QScriptValueImpl &r = instance->reference(member);
- if (r.isNumber()) {
- *(--stackPtr) = QScriptValueImpl(r.m_number_value);
- r.incr();
- ++iPtr;
- Next();
- }
- }
- base = object;
- } else if (!object.resolve_helper(memberName, &member, &base, mode, QScript::ReadWrite)) {
- if (!isMemberAssignment) {
- stackPtr -= 2;
- throwNotDefined(memberName);
- HandleException();
- }
- base = object;
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0);
- base.put(member, undefined);
- }
-
- QScriptValueImpl getter;
- QScriptValueImpl setter;
- base.get(member, &value);
- if (hasUncaughtException()) {
- stackPtr -= 2;
- HandleException();
- } else if (member.isGetterOrSetter()) {
- if (member.isGetter()) {
- getter = value;
- if (!member.isSetter() && !base.m_object_value->findSetter(&member)) {
- stackPtr -= 2;
- throwError(QLatin1String("No setter defined"));
- HandleException();
- }
- base.get(member, &setter);
- } else {
- setter = value;
- QScript::Member tmp = member;
- if (!base.m_object_value->findGetter(&member)) {
- stackPtr -= 2;
- throwError(QLatin1String("No getter defined"));
- HandleException();
- }
- base.get(member, &getter);
- member = tmp;
- }
- value = getter.call(object);
- if (hasUncaughtException()) {
- stackPtr -= 2;
- Done();
- }
- }
-
- qsreal x = QScriptEnginePrivate::convertToNativeDouble(value);
-
- value = QScriptValueImpl(x + 1);
-
- if (member.isSetter()) {
- setter.call(object, QScriptValueImplList() << value);
- if (hasUncaughtException()) {
- stackPtr -= 2;
- Done();
- }
- } else {
- if (isMemberAssignment && (base.m_object_value != object.m_object_value)) {
- base = object;
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0);
- }
- if (member.isWritable()) {
- base.put(member, value);
- if (hasUncaughtException()) {
- stackPtr -= 2;
- HandleException();
- }
- }
- }
-
- *(--stackPtr) = QScriptValueImpl(x);
-
- ++iPtr;
- } Next();
-
- I(PostDecr):
- {
- // ### most of the code is duplicated from PostIncr -- try to merge
- if (! stackPtr[0].isReference()) {
- stackPtr -= 1;
- throwSyntaxError(QLatin1String("invalid decrement operand"));
- HandleException();
- }
-
- QScriptValue::ResolveFlags mode = QScriptValue::ResolveFlags(stackPtr[0].m_int_value)
- | QScriptValue::ResolvePrototype;
-
- --stackPtr;
-
- QScriptValueImpl object = eng->toObject(stackPtr[-1]);
- if (!object.isObject()) {
- stackPtr -= 2;
- throwTypeError(QLatin1String("not an object"));
- HandleException();
- }
-
- QScriptNameIdImpl *memberName = 0;
- if (stackPtr[0].isString() && stackPtr[0].m_string_value->unique)
- memberName = stackPtr[0].m_string_value;
- else
- memberName = eng->nameId(stackPtr[0].toString(), /*persistent=*/false);
-
- QScript::Member member;
- QScriptValueImpl base;
- QScriptValueImpl value;
- QScriptObject *instance = object.m_object_value;
- const bool isMemberAssignment = (instance != m_scopeChain.m_object_value);
- if (instance->findMember(memberName, &member)) {
- if (!member.isGetterOrSetter()) {
- QScriptValueImpl &r = instance->reference(member);
- if (r.isNumber()) {
- *(--stackPtr) = QScriptValueImpl(r.m_number_value);
- r.decr();
- ++iPtr;
- Next();
- }
- }
- base = object;
- } else if (! object.resolve_helper(memberName, &member, &base, mode, QScript::ReadWrite)) {
- if (!isMemberAssignment) {
- stackPtr -= 2;
- throwNotDefined(memberName);
- HandleException();
- }
- base = object;
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0);
- base.put(member, undefined);
- }
-
- QScriptValueImpl getter;
- QScriptValueImpl setter;
- base.get(member, &value);
- if (hasUncaughtException()) {
- stackPtr -= 2;
- HandleException();
- } else if (member.isGetterOrSetter()) {
- if (member.isGetter()) {
- getter = value;
- if (!member.isSetter() && !base.m_object_value->findSetter(&member)) {
- stackPtr -= 2;
- throwError(QLatin1String("No setter defined"));
- HandleException();
- }
- base.get(member, &setter);
- } else {
- setter = value;
- QScript::Member tmp = member;
- if (!base.m_object_value->findGetter(&member)) {
- stackPtr -= 2;
- throwError(QLatin1String("No getter defined"));
- HandleException();
- }
- base.get(member, &getter);
- member = tmp;
- }
- value = getter.call(object);
- if (hasUncaughtException()) {
- stackPtr -= 2;
- Done();
- }
- }
-
- qsreal x = QScriptEnginePrivate::convertToNativeDouble(value);
-
- value = QScriptValueImpl(x - 1);
-
- if (member.isSetter()) {
- setter.call(object, QScriptValueImplList() << value);
- if (hasUncaughtException()) {
- stackPtr -= 2;
- Done();
- }
- } else {
- if (isMemberAssignment && (base.m_object_value != object.m_object_value)) {
- base = object;
- CREATE_MEMBER(base, memberName, &member, /*flags=*/0);
- }
- if (member.isWritable()) {
- base.put(member, value);
- if (hasUncaughtException()) {
- stackPtr -= 2;
- HandleException();
- }
- }
- }
-
- *(--stackPtr) = QScriptValueImpl(x);
-
- ++iPtr;
- } Next();
-
- I(InplaceAdd):
- {
- BEGIN_INPLACE_OPERATOR
-
- lhs = eng->toPrimitive(lhs);
- rhs = eng->toPrimitive(rhs);
- if (lhs.isString() || rhs.isString()) {
- if (lhs.isString() && !lhs.m_string_value->unique) {
- lhs.m_string_value->s += QScriptEnginePrivate::convertToNativeString(rhs);
- stackPtr -= 3;
- *stackPtr = lhs;
- } else {
- QString tmp = QScriptEnginePrivate::convertToNativeString(lhs);
- tmp += QScriptEnginePrivate::convertToNativeString(rhs);
- stackPtr -= 3;
- eng->newString(stackPtr, tmp);
- }
- } else {
- qsreal tmp = QScriptEnginePrivate::convertToNativeDouble(lhs);
- tmp += QScriptEnginePrivate::convertToNativeDouble(rhs);
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(tmp);
- }
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceSub):
- {
- BEGIN_INPLACE_OPERATOR
-
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(lhs);
- qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 - v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceAnd):
- {
- BEGIN_INPLACE_OPERATOR
-
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 & v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceDiv):
- {
- BEGIN_INPLACE_OPERATOR
-
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(lhs);
- qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 / v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceLeftShift):
- {
- BEGIN_INPLACE_OPERATOR
-
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 << v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceMod):
- {
- BEGIN_INPLACE_OPERATOR
-
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(lhs);
- qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(::fmod (v1, v2));
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceMul):
- {
- BEGIN_INPLACE_OPERATOR
-
- qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(lhs);
- qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 * v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceOr):
- {
- BEGIN_INPLACE_OPERATOR
-
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 | v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceRightShift):
- {
- BEGIN_INPLACE_OPERATOR
-
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 >> v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceURightShift):
- {
- BEGIN_INPLACE_OPERATOR
-
- quint32 v1 = QScriptEnginePrivate::toUint32 (eng->convertToNativeDouble(lhs));
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 >> v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(InplaceXor):
- {
- BEGIN_INPLACE_OPERATOR
-
- qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs);
- qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs);
-
- stackPtr -= 3;
- *stackPtr = QScriptValueImpl(v1 ^ v2);
-
- END_INPLACE_OPERATOR
- } Next();
-
- I(MakeReference):
- {
- CHECK_TEMPSTACK(1);
- eng->newReference(++stackPtr, QScriptValue::ResolveLocal);
- ++iPtr;
- } Next();
-
- I(TypeOf):
- {
- QScriptValueImpl value;
-
- bool isReference = stackPtr[0].isReference();
-
- if (! isReference) { // we have a value
- value = stackPtr[0];
- } else if (resolveField(eng, &stackPtr[-1], &value)) {
- stackPtr -= 2;
- if (hasUncaughtException()) {
- stackPtr -= 1;
- HandleException();
- }
- } else {
- value = undefined;
- stackPtr -= 2;
- }
-
- QString typeName;
-
- switch (value.type()) {
- case QScript::InvalidType:
- typeName = QLatin1String("invalid");
- break;
-
- case QScript::UndefinedType:
- typeName = QLatin1String("undefined");
- break;
-
- case QScript::NullType:
- typeName = QLatin1String("object");
- break;
-
- case QScript::BooleanType:
- typeName = QLatin1String("boolean");
- break;
-
- case QScript::IntegerType:
- case QScript::NumberType:
- typeName = QLatin1String("number");
- break;
-
- case QScript::StringType:
- case QScript::LazyStringType:
- typeName = QLatin1String("string");
- break;
-
- case QScript::ReferenceType:
- typeName = QLatin1String("reference");
- break;
-
- case QScript::PointerType:
- typeName = QLatin1String("pointer");
- break;
-
- case QScript::ObjectType:
- if (value.isFunction())
- typeName = QLatin1String("function");
- else
- typeName = QLatin1String("object");
- break;
- }
-
- eng->newString(stackPtr, typeName);
- ++iPtr;
- } Next();
-
- I(Line):
- {
- eng->maybeGC();
- eng->maybeProcessEvents();
- if (hasUncaughtException())
- HandleException();
- if (eng->shouldAbort())
- Abort();
- currentLine = iPtr->operand[0].m_int_value;
- currentColumn = iPtr->operand[1].m_int_value;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- if (eng->shouldNotify()) {
- eng->notifyPositionChange(this);
- if (hasUncaughtException())
- HandleException();
- if (eng->shouldAbort())
- Abort();
- }
-#endif
- ++iPtr;
- } Next();
-
- I(Delete):
- {
- bool result;
- if (! stackPtr[0].isReference())
- result = true;
-
- else {
- QScriptValueImpl object = stackPtr[-2];
- if (!object.isObject())
- object = eng->toObject(object);
-
- QScriptNameIdImpl *nameId = 0;
- if (stackPtr[-1].isString() && stackPtr[-1].m_string_value->unique) {
- nameId = stackPtr[-1].m_string_value;
- } else {
- nameId = eng->nameId(QScriptEnginePrivate::convertToNativeString(stackPtr[-1]),
- /*persistent=*/false);
- }
- if (object.classInfo() == eng->m_class_with)
- object = object.prototype();
- result = object.deleteProperty(nameId, QScriptValue::ResolveScope);
- stackPtr -= 2;
- }
-
- *stackPtr = QScriptValueImpl(result);
-
- ++iPtr;
- } Next();
-
-
- I(NewEnumeration): {
- QScriptValueImpl e;
- QScriptValueImpl object = eng->toObject(stackPtr[0]);
- eng->enumerationConstructor->newEnumeration(&e, object);
- *stackPtr = e;
- ++iPtr;
- } Next();
-
-
- I(ToFirstElement): {
- QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[0]);
- Q_ASSERT(e != 0);
- e->toFront();
- --stackPtr;
- ++iPtr;
- } Next();
-
-
- I(HasNextElement): {
- QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[0]);
- Q_ASSERT(e != 0);
- e->hasNext(this, stackPtr);
- ++iPtr;
- } Next();
-
-
- I(NextElement): {
- // the Enumeration should be located below the result of I(Resolve)
- if (! stackPtr[0].isReference()) {
- throwTypeError(QLatin1String("QScript.VM.NextElement"));
- HandleException();
- }
-
- QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[-3]);
- if (! e) {
- throwTypeError(QLatin1String("QScript.VM.NextElement"));
- HandleException();
- }
- e->next(this, ++stackPtr);
- ++iPtr;
- } Next();
-
-
- I(Pop):
- {
- --stackPtr;
- ++iPtr;
- } Next();
-
- I(Sync):
- {
- m_result = *stackPtr;
- --stackPtr;
- ++iPtr;
- } Next();
-
- I(Throw):
- {
- Q_ASSERT(stackPtr->isValid());
- m_result = *stackPtr--;
- if (!m_result.isError() && !exceptionHandlerContext())
- eng->m_exceptionBacktrace = backtrace();
- m_state = QScriptContext::ExceptionState;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng->notifyException(this);
-#endif
- } HandleException();
-
- I(Ret):
- {
- Q_ASSERT(stackPtr->isValid());
- m_result = *stackPtr--;
- ++iPtr;
- } Done();
-
- I(Halt):
- {
- ++iPtr;
- } Done();
-
- I(EnterWith):
- {
- QScriptValueImpl object = eng->toObject(*stackPtr--);
- if (! object.isValid()) {
- throwTypeError(QLatin1String("value has no properties"));
- HandleException();
- }
- QScriptValueImpl withObject;
- eng->newObject(&withObject, object, eng->m_class_with);
- withObject.m_object_value->m_scope = m_scopeChain;
- m_scopeChain = withObject;
- ++iPtr;
- } Next();
-
- I(LeaveWith):
- {
- QScriptValueImpl withObject = m_scopeChain;
- m_scopeChain = withObject.m_object_value->m_scope;
- ++iPtr;
- } Next();
-
- I(BeginCatch):
- {
- // result contains the thrown object
- QScriptValueImpl object;
- eng->newObject(&object, undefined); // ### prototype
- QScript::Member member;
- CREATE_MEMBER(object, iPtr->operand[0].m_string_value, &member, /*flags=*/0);
- object.put(member, m_result);
- // make catch-object head of scopechain
- object.m_object_value->m_scope = m_scopeChain;
- m_scopeChain = object;
-
- catching = true;
- ++iPtr;
- } Next();
-
- I(EndCatch):
- {
- // remove catch-object from scopechain
- QScriptValueImpl object = m_scopeChain;
- m_scopeChain = object.m_object_value->m_scope;
-
- catching = false;
- ++iPtr;
- } Next();
-
- I(Debugger):
- {
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng->notifyDebugger(this);
-#endif
- ++iPtr;
- } Next();
-
-#ifndef Q_SCRIPT_DIRECT_CODE
- I(Dummy):
- { ; }
-
- } // end switch
-#endif
-
-Lhandle_exception:
- errorLineNumber = currentLine;
-
-Ldone:
- Q_ASSERT(m_result.isValid());
-
- if (m_state == QScriptContext::ExceptionState) {
- if (catching) {
- // exception thrown in catch -- clean up scopechain
- QScriptValueImpl object = m_scopeChain;
- m_scopeChain = object.m_object_value->m_scope;
- catching = false;
- }
-
- // see if we have an exception handler in this context
- const QScriptInstruction *exPtr = findExceptionHandler(iPtr);
- if (exPtr) {
- if (m_scopeChain.classInfo() == eng->m_class_with) {
- // clean up effects of with-statements if necessary
- int withLevel = 0;
- for (++iPtr; iPtr != exPtr; ++iPtr) {
- if (iPtr->op == QScriptInstruction::OP_EnterWith) {
- ++withLevel;
- } else if (iPtr->op == QScriptInstruction::OP_LeaveWith) {
- --withLevel;
- if (withLevel < 0) {
- QScriptValueImpl withObject = m_scopeChain;
- m_scopeChain = withObject.m_object_value->m_scope;
- }
- }
- }
- } else {
- iPtr = exPtr;
- }
- // go to the handler
- recover();
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng->notifyExceptionCatch(this);
-#endif
- goto Ltop;
- } else {
- if (!parentContext()) {
- // pop all the top-level with-objects
- while ((m_scopeChain.classInfo() == eng->m_class_with)
- && !m_scopeChain.internalValue().isValid()) {
- QScriptValueImpl withObject = m_scopeChain;
- m_scopeChain = withObject.m_object_value->m_scope;
- }
- }
- }
- }
-
-Labort:
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng->notifyFunctionExit(this);
-#endif
-
- eng->maybeGC();
-
- currentLine = oldCurrentLine;
- currentColumn = oldCurrentColumn;
- m_code = oldCode;
-
- eng->m_evaluating = wasEvaluating;
-}
-
-QScriptValueImpl QScriptContextPrivate::throwError(QScriptContext::Error error, const QString &text)
-{
- QScriptEnginePrivate *eng_p = engine();
- QScript::Ecma::Error *ctor = eng_p->errorConstructor;
- m_result.invalidate();
- switch (error) {
- case QScriptContext::ReferenceError:
- ctor->newReferenceError(&m_result, text);
- break;
- case QScriptContext::SyntaxError:
- ctor->newSyntaxError(&m_result, text);
- break;
- case QScriptContext::TypeError:
- ctor->newTypeError(&m_result, text);
- break;
- case QScriptContext::RangeError:
- ctor->newRangeError(&m_result, text);
- break;
- case QScriptContext::URIError:
- ctor->newURIError(&m_result, text);
- break;
- case QScriptContext::UnknownError:
- default:
- ctor->newError(&m_result, text);
- }
- setDebugInformation(&m_result);
- m_state = QScriptContext::ExceptionState;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyException(this);
-#endif
- return m_result;
-}
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
-qint64 QScriptContextPrivate::scriptId() const
-{
- if (!m_code)
- return -1;
- return m_code->astPool->id();
-}
-#endif
-
-QString QScriptContextPrivate::fileName() const
-{
- if (!m_code)
- return QString();
- return m_code->astPool->fileName();
-}
-
-QString QScriptContextPrivate::functionName() const
-{
- if (!m_callee.isValid())
- return QString();
- QScriptFunction *fun = m_callee.toFunction();
- if (fun)
- return fun->functionName();
- return QString();
-}
-
-void QScriptContextPrivate::setDebugInformation(QScriptValueImpl *error) const
-{
- QScriptEnginePrivate *eng_p = engine();
- error->setProperty(QLatin1String("lineNumber"), QScriptValueImpl(currentLine));
- if (!fileName().isEmpty())
- error->setProperty(QLatin1String("fileName"), QScriptValueImpl(eng_p, fileName()));
-
- const QScriptContextPrivate *ctx = this;
- QScriptValueImpl stackArray = eng_p->newArray();
- int i = 0;
- while (ctx) {
- QScriptValueImpl obj = eng_p->newObject();
- obj.setProperty(QLatin1String("frame"), ctx->activationObject());
- obj.setProperty(QLatin1String("lineNumber"), QScriptValueImpl(ctx->currentLine));
- if (!ctx->fileName().isEmpty())
- obj.setProperty(QLatin1String("fileName"), QScriptValueImpl(eng_p, ctx->fileName()));
- if (!ctx->functionName().isEmpty())
- obj.setProperty(QLatin1String("functionName"), QScriptValueImpl(eng_p, ctx->functionName()));
- stackArray.setProperty(i, obj);
- ctx = ctx->parentContext();
- ++i;
- }
- error->setProperty(QLatin1String("stack"), stackArray);
-}
-
-QStringList QScriptContextPrivate::backtrace() const
-{
- QStringList result;
- const QScriptContextPrivate *ctx = this;
- while (ctx) {
- QString s;
- QString functionName = ctx->functionName();
- if (!functionName.isEmpty())
- s += functionName;
- else {
- if (ctx->parentContext()) {
- if (ctx->callee().isFunction()
- && ctx->callee().toFunction()->type() != QScriptFunction::Script) {
- s += QLatin1String("<native>");
- } else {
- s += QLatin1String("<anonymous>");
- }
- } else {
- s += QLatin1String("<global>");
- }
- }
- s += QLatin1Char('(');
- for (int i = 0; i < ctx->argc; ++i) {
- if (i > 0)
- s += QLatin1Char(',');
- QScriptValueImpl arg = ctx->args[i];
- if (arg.isObject())
- s += QLatin1String("[object Object]"); // don't do a function call
- else
- s += arg.toString();
- }
- s += QLatin1String(")@");
- s += ctx->fileName();
- s += QString::fromLatin1(":%0").arg(ctx->currentLine);
- result.append(s);
- ctx = ctx->parentContext();
- }
- return result;
-}
-
-QScriptValueImpl QScriptContextPrivate::throwError(const QString &text)
-{
- return throwError(QScriptContext::UnknownError, text);
-}
-
-QScriptValueImpl QScriptContextPrivate::throwNotImplemented(const QString &name)
-{
- return throwTypeError(QString::fromUtf8("%1 is not implemented").arg(name));
-}
-
-QScriptValueImpl QScriptContextPrivate::throwNotDefined(const QString &name)
-{
- return throwError(QScriptContext::ReferenceError,
- QString::fromUtf8("%1 is not defined").arg(name));
-}
-
-QScriptValueImpl QScriptContextPrivate::throwNotDefined(QScriptNameIdImpl *nameId)
-{
- return throwNotDefined(QScriptEnginePrivate::toString(nameId));
-}
-
-bool QScriptContextPrivate::eq_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs)
-{
- if (lhs.isNull() && rhs.isUndefined())
- return true;
-
- else if (lhs.isUndefined() && rhs.isNull())
- return true;
-
- else if (isNumerical(lhs) && rhs.isString())
- return QScriptEnginePrivate::convertToNativeDouble(lhs) == QScriptEnginePrivate::convertToNativeDouble(rhs);
-
- else if (lhs.isString() && isNumerical(rhs))
- return QScriptEnginePrivate::convertToNativeDouble(lhs) == QScriptEnginePrivate::convertToNativeDouble(rhs);
-
- else if (lhs.isBoolean())
- return eq_cmp(QScriptValueImpl(QScriptEnginePrivate::convertToNativeDouble(lhs)), rhs);
-
- else if (rhs.isBoolean())
- return eq_cmp(lhs, QScriptValueImpl(QScriptEnginePrivate::convertToNativeDouble(rhs)));
-
- else if (lhs.isObject() && ! rhs.isNull()) {
- lhs = lhs.engine()->toPrimitive(lhs);
-
- if (lhs.isValid() && ! lhs.isObject())
- return eq_cmp(lhs, rhs);
- }
-
- else if (rhs.isObject() && ! lhs.isNull()) {
- rhs = rhs.engine()->toPrimitive(rhs);
-
- if (rhs.isValid() && ! rhs.isObject())
- return eq_cmp(lhs, rhs);
- }
-
- return false;
-}
-
-#if defined(Q_CC_GNU) && __GNUC__ <= 3
-bool QScriptContextPrivate::lt_cmp(QScriptValueImpl lhs, QScriptValueImpl rhs)
-{
- if (lhs.type() == rhs.type()) {
- switch (lhs.type()) {
- case QScript::InvalidType:
- case QScript::UndefinedType:
- case QScript::NullType:
- return false;
-
- case QScript::NumberType:
- return lhs.m_number_value < rhs.m_number_value;
-
- case QScript::IntegerType:
- return lhs.m_int_value < rhs.m_int_value;
-
- case QScript::BooleanType:
- return lhs.m_bool_value < rhs.m_bool_value;
-
- default:
- break;
- } // switch
- }
-#else
-bool QScriptContextPrivate::lt_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs)
-{
-#endif
- if ((lhs.type() == rhs.type()) && (lhs.type() == QScript::StringType))
- return lhs.m_string_value->s < rhs.m_string_value->s;
-
- if (lhs.isObject())
- lhs = lhs.engine()->toPrimitive(lhs, QScriptValueImpl::NumberTypeHint);
-
- if (rhs.isObject())
- rhs = rhs.engine()->toPrimitive(rhs, QScriptValueImpl::NumberTypeHint);
-
- if (lhs.isString() && rhs.isString())
- return QScriptEnginePrivate::convertToNativeString(lhs) < QScriptEnginePrivate::convertToNativeString(rhs);
-
- qsreal n1 = QScriptEnginePrivate::convertToNativeDouble(lhs);
- qsreal n2 = QScriptEnginePrivate::convertToNativeDouble(rhs);
-#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET
- if (qIsNaN(n1) || qIsNaN(n2))
- return false;
-#endif
- return n1 < n2;
-}
-
-bool QScriptContextPrivate::le_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs)
-{
- if ((lhs.type() == rhs.type()) && (lhs.type() == QScript::StringType))
- return lhs.m_string_value->s <= rhs.m_string_value->s;
-
- if (lhs.isObject())
- lhs = lhs.engine()->toPrimitive(lhs, QScriptValueImpl::NumberTypeHint);
-
- if (rhs.isObject())
- rhs = rhs.engine()->toPrimitive(rhs, QScriptValueImpl::NumberTypeHint);
-
- if (lhs.isString() && rhs.isString())
- return QScriptEnginePrivate::convertToNativeString(lhs) <= QScriptEnginePrivate::convertToNativeString(rhs);
-
- qsreal n1 = QScriptEnginePrivate::convertToNativeDouble(lhs);
- qsreal n2 = QScriptEnginePrivate::convertToNativeDouble(rhs);
- return n1 <= n2;
-}
-
-const QScriptInstruction *QScriptContextPrivate::findExceptionHandler(
- const QScriptInstruction *ip) const
-{
- Q_ASSERT(m_code);
- int offset = ip - m_code->firstInstruction;
- for (int i = 0; i < m_code->exceptionHandlers.count(); ++i) {
- QScript::ExceptionHandlerDescriptor e = m_code->exceptionHandlers.at(i);
- if (offset >= e.startInstruction() && offset <= e.endInstruction()) {
- return m_code->firstInstruction + e.handlerInstruction();
- }
- }
- return 0;
-}
-
-const QScriptInstruction *QScriptContextPrivate::findExceptionHandlerRecursive(
- const QScriptInstruction *ip, QScriptContextPrivate **handlerContext) const
-{
- const QScriptContextPrivate *ctx = this;
- const QScriptInstruction *iip = ip;
- while (ctx) {
- if (ctx->m_code) {
- const QScriptInstruction *ep = ctx->findExceptionHandler(iip);
- if (ep) {
- Q_ASSERT(handlerContext);
- *handlerContext = const_cast<QScriptContextPrivate*>(ctx);
- return ep;
- }
- }
- ctx = ctx->parentContext();
- if (ctx)
- iip = ctx->iPtr;
- }
- return 0;
-}
-
-/*!
- Requires that iPtr in current context is in sync
-*/
-QScriptContextPrivate *QScriptContextPrivate::exceptionHandlerContext() const
-{
- QScriptContextPrivate *handlerContext;
- if (findExceptionHandlerRecursive(iPtr, &handlerContext))
- return handlerContext;
- return 0;
-}
-
-QScriptContext *QScriptContextPrivate::get(QScriptContextPrivate *d)
-{
- if (d)
- return d->q_func();
- return 0;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptcontext_p.h b/src/script/qscriptcontext_p.h
deleted file mode 100644
index b5be471..0000000
--- a/src/script/qscriptcontext_p.h
+++ /dev/null
@@ -1,361 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCONTEXT_P_H
-#define QSCRIPTCONTEXT_P_H
-
-#include "qscriptcontextfwd_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptenginefwd_p.h"
-#include "qscriptnameid_p.h"
-
-#include <QtCore/qnumeric.h>
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-inline QScriptContextPrivate::QScriptContextPrivate()
- : previous(0),
- argc(0),
- m_state(QScriptContext::NormalState),
- args(0),
- tempStack(0),
- stackPtr(0),
- m_code(0),
- iPtr(0),
- firstInstruction(0),
- lastInstruction(0),
- currentLine(0),
- currentColumn(0),
- errorLineNumber(0),
- catching(false),
- m_calledAsConstructor(false),
- calleeMetaIndex(0),
- q_ptr(0)
-{
-}
-
-inline QScriptContextPrivate *QScriptContextPrivate::get(QScriptContext *q)
-{
- if (q)
- return q->d_func();
- return 0;
-}
-
-inline const QScriptContextPrivate *QScriptContextPrivate::get(const QScriptContext *q)
-{
- if (q)
- return q->d_func();
- return 0;
-}
-
-inline QScriptContext *QScriptContextPrivate::create()
-{
- return new QScriptContext;
-}
-
-inline QScriptEnginePrivate *QScriptContextPrivate::engine() const
-{
- return m_activation.engine();
-}
-
-inline QScriptContextPrivate *QScriptContextPrivate::parentContext() const
-{
- return previous;
-}
-
-inline void QScriptContextPrivate::init(QScriptContextPrivate *parent)
-{
- m_state = QScriptContext::NormalState;
- previous = parent;
- args = 0;
- argc = 0;
- m_code = 0;
- iPtr = firstInstruction = lastInstruction = 0;
- stackPtr = tempStack = (parent != 0) ? parent->stackPtr : 0;
- m_activation.invalidate();
- m_thisObject.invalidate();
- m_result.invalidate();
- m_scopeChain.invalidate();
- m_callee.invalidate();
- m_arguments.invalidate();
- currentLine = -1;
- currentColumn = -1;
- errorLineNumber = -1;
- m_calledAsConstructor = false;
-}
-
-inline QScriptValueImpl QScriptContextPrivate::argument(int index) const
-{
- if (index >= argc)
- return engine()->undefinedValue();
-
- Q_ASSERT(args != 0);
- return args[index];
-}
-
-inline int QScriptContextPrivate::argumentCount() const
-{
- return argc;
-}
-
-inline QScriptValueImpl QScriptContextPrivate::argumentsObject() const
-{
- if (!m_arguments.isValid() && m_activation.isValid()) {
- QScriptContextPrivate *dd = const_cast<QScriptContextPrivate*>(this);
- engine()->newArguments(&dd->m_arguments, m_activation,
- argc, m_callee);
- }
- return m_arguments;
-}
-
-inline void QScriptContextPrivate::throwException()
-{
- m_state = QScriptContext::ExceptionState;
-}
-
-inline bool QScriptContextPrivate::hasUncaughtException() const
-{
- return m_state == QScriptContext::ExceptionState;
-}
-
-inline void QScriptContextPrivate::recover()
-{
- m_state = QScriptContext::NormalState;
- errorLineNumber = -1;
-}
-
-inline bool QScriptContextPrivate::isNumerical(const QScriptValueImpl &v)
-{
- switch (v.type()) {
- case QScript::BooleanType:
- case QScript::IntegerType:
- case QScript::NumberType:
- return true;
-
- default:
- return false;
- }
-}
-
-inline bool QScriptContextPrivate::eq_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs)
-{
- if (lhs.type() == rhs.type()) {
- switch (lhs.type()) {
- case QScript::InvalidType:
- case QScript::UndefinedType:
- case QScript::NullType:
- return true;
-
- case QScript::NumberType:
- return lhs.m_number_value == rhs.m_number_value;
-
- case QScript::ReferenceType:
- case QScript::IntegerType:
- return lhs.m_int_value == rhs.m_int_value;
-
- case QScript::BooleanType:
- return lhs.m_bool_value == rhs.m_bool_value;
-
- case QScript::StringType:
- if (lhs.m_string_value->unique && rhs.m_string_value->unique)
- return lhs.m_string_value == rhs.m_string_value;
- return lhs.m_string_value->s == rhs.m_string_value->s;
-
- case QScript::PointerType:
- return lhs.m_ptr_value == rhs.m_ptr_value;
-
- case QScript::ObjectType:
- if (lhs.isVariant())
- return lhs.m_object_value == rhs.m_object_value || lhs.toVariant() == rhs.toVariant();
-#ifndef QT_NO_QOBJECT
- else if (lhs.isQObject())
- return lhs.m_object_value == rhs.m_object_value || lhs.toQObject() == rhs.toQObject();
-#endif
- else
- return lhs.m_object_value == rhs.m_object_value;
-
- case QScript::LazyStringType:
- return *lhs.m_lazy_string_value == *rhs.m_lazy_string_value;
- }
- }
-
- return eq_cmp_helper(lhs, rhs);
-}
-
-inline bool QScriptContextPrivate::strict_eq_cmp( const QScriptValueImpl &lhs, const QScriptValueImpl &rhs)
-{
- if (lhs.type() != rhs.type())
- return false;
-
- switch (lhs.type()) {
- case QScript::InvalidType:
- case QScript::UndefinedType:
- case QScript::NullType:
- return true;
-
- case QScript::NumberType:
- if (qIsNaN(lhs.m_number_value) || qIsNaN(rhs.m_number_value))
- return false;
- return lhs.m_number_value == rhs.m_number_value;
-
- case QScript::IntegerType:
- return lhs.m_int_value == rhs.m_int_value;
-
- case QScript::BooleanType:
- return lhs.m_bool_value == rhs.m_bool_value;
-
- case QScript::StringType:
- if (lhs.m_string_value->unique && rhs.m_string_value->unique)
- return lhs.m_string_value == rhs.m_string_value;
- return lhs.m_string_value->s == rhs.m_string_value->s;
-
- case QScript::ObjectType:
- return lhs.m_object_value == rhs.m_object_value;
-
- case QScript::ReferenceType:
- return lhs.m_int_value == rhs.m_int_value;
-
- case QScript::PointerType:
- return lhs.m_ptr_value == rhs.m_ptr_value;
-
- case QScript::LazyStringType:
- return *lhs.m_lazy_string_value == *rhs.m_lazy_string_value;
- }
-
- return false;
-}
-
-inline QScriptValueImpl QScriptContextPrivate::throwTypeError(const QString &text)
-{
- return throwError(QScriptContext::TypeError, text);
-}
-
-inline QScriptValueImpl QScriptContextPrivate::throwSyntaxError(const QString &text)
-{
- return throwError(QScriptContext::SyntaxError, text);
-}
-
-inline QScriptValueImpl QScriptContextPrivate::thisObject() const
-{
- return m_thisObject;
-}
-
-inline void QScriptContextPrivate::setThisObject(const QScriptValueImpl &object)
-{
- m_thisObject = object;
-}
-
-inline QScriptValueImpl QScriptContextPrivate::callee() const
-{
- return m_callee;
-}
-
-inline bool QScriptContextPrivate::isCalledAsConstructor() const
-{
- return m_calledAsConstructor;
-}
-
-inline QScriptValueImpl QScriptContextPrivate::returnValue() const
-{
- return m_result;
-}
-
-inline void QScriptContextPrivate::setReturnValue(const QScriptValueImpl &value)
-{
- m_result = value;
-}
-
-inline QScriptValueImpl QScriptContextPrivate::activationObject() const
-{
- if (previous && !m_activation.property(QLatin1String("arguments")).isValid()) {
- QScriptContextPrivate *dd = const_cast<QScriptContextPrivate*>(this);
- dd->m_activation.setProperty(QLatin1String("arguments"), argumentsObject());
- }
- return m_activation;
-}
-
-inline void QScriptContextPrivate::setActivationObject(const QScriptValueImpl &activation)
-{
- m_activation = activation;
-}
-
-inline const QScriptInstruction *QScriptContextPrivate::instructionPointer()
-{
- return iPtr;
-}
-
-inline void QScriptContextPrivate::setInstructionPointer(const QScriptInstruction *instructionPointer)
-{
- iPtr = instructionPointer;
-}
-
-inline const QScriptValueImpl *QScriptContextPrivate::baseStackPointer() const
-{
- return tempStack;
-}
-
-inline const QScriptValueImpl *QScriptContextPrivate::currentStackPointer() const
-{
- return stackPtr;
-}
-
-inline QScriptContext::ExecutionState QScriptContextPrivate::state() const
-{
- return m_state;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif
diff --git a/src/script/qscriptcontextfwd_p.h b/src/script/qscriptcontextfwd_p.h
deleted file mode 100644
index 9b486d6..0000000
--- a/src/script/qscriptcontextfwd_p.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCONTEXTFWD_P_H
-#define QSCRIPTCONTEXTFWD_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptvalueimplfwd_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptcontext.h"
-
-#include <QtCore/qobjectdefs.h>
-
-#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET
-#include <QtCore/qnumeric.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
- namespace AST {
- class Node;
- }
-class Code;
-}
-
-class QScriptInstruction;
-
-class QScriptContextPrivate
-{
- Q_DECLARE_PUBLIC(QScriptContext)
-public:
- inline QScriptContextPrivate();
-
- static inline QScriptContextPrivate *get(QScriptContext *q);
- static inline const QScriptContextPrivate *get(const QScriptContext *q);
- static QScriptContext *get(QScriptContextPrivate *d);
-
- static inline QScriptContext *create();
-
- inline QScriptEnginePrivate *engine() const;
- inline QScriptContextPrivate *parentContext() const;
-
- inline void init(QScriptContextPrivate *parent);
- inline QScriptValueImpl argument(int index) const;
- inline int argumentCount() const;
- inline QScriptValueImpl argumentsObject() const;
-
- inline void throwException();
- inline bool hasUncaughtException() const;
- const QScriptInstruction *findExceptionHandler(const QScriptInstruction *ip) const;
- const QScriptInstruction *findExceptionHandlerRecursive(
- const QScriptInstruction *ip, QScriptContextPrivate **handlerContext) const;
- QScriptContextPrivate *exceptionHandlerContext() const;
- inline void recover();
- QStringList backtrace() const;
-
- static inline bool isNumerical(const QScriptValueImpl &v);
-
- static inline bool eq_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs);
-
- static bool eq_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs);
-
-#if defined(Q_CC_GNU) && __GNUC__ <= 3
- static bool lt_cmp(QScriptValueImpl lhs, QScriptValueImpl rhs);
-#else
- static bool lt_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs)
- {
- if (lhs.type() == rhs.type()) {
- switch (lhs.type()) {
- case QScript::UndefinedType:
- case QScript::NullType:
- return false;
-
- case QScript::NumberType:
-#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET
- if (qIsNaN(lhs.m_number_value) || qIsNaN(rhs.m_number_value))
- return false;
-#endif
- return lhs.m_number_value < rhs.m_number_value;
-
- case QScript::IntegerType:
- return lhs.m_int_value < rhs.m_int_value;
-
- case QScript::BooleanType:
- return lhs.m_bool_value < rhs.m_bool_value;
-
- default:
- break;
- } // switch
- }
-
- return lt_cmp_helper(lhs, rhs);
- }
-
- static bool lt_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs);
-#endif
-
- static bool le_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs)
- {
- if (lhs.type() == rhs.type()) {
- switch (lhs.type()) {
- case QScript::UndefinedType:
- case QScript::NullType:
- return true;
-
- case QScript::NumberType:
- return lhs.m_number_value <= rhs.m_number_value;
-
- case QScript::IntegerType:
- return lhs.m_int_value <= rhs.m_int_value;
-
- case QScript::BooleanType:
- return lhs.m_bool_value <= rhs.m_bool_value;
-
- default:
- break;
- } // switch
- }
-
- return le_cmp_helper(lhs, rhs);
- }
-
- static bool le_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs);
-
- static inline bool strict_eq_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs);
-
- bool resolveField(QScriptEnginePrivate *eng, QScriptValueImpl *stackPtr,
- QScriptValueImpl *value);
-
- void execute(QScript::Code *code);
-
- QScriptValueImpl throwError(QScriptContext::Error error, const QString &text);
- QScriptValueImpl throwError(const QString &text);
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- qint64 scriptId() const;
-#endif
- QString fileName() const;
- QString functionName() const;
- void setDebugInformation(QScriptValueImpl *error) const;
-
- QScriptValueImpl throwNotImplemented(const QString &name);
- QScriptValueImpl throwNotDefined(const QString &name);
- QScriptValueImpl throwNotDefined(QScriptNameIdImpl *nameId);
-
- inline QScriptValueImpl throwTypeError(const QString &text);
- inline QScriptValueImpl throwSyntaxError(const QString &text);
-
- inline QScriptValueImpl thisObject() const;
- inline void setThisObject(const QScriptValueImpl &object);
-
- inline QScriptValueImpl callee() const;
- inline bool isCalledAsConstructor() const;
-
- inline QScriptValueImpl returnValue() const;
- inline void setReturnValue(const QScriptValueImpl &value);
-
- inline QScriptValueImpl activationObject() const;
- inline void setActivationObject(const QScriptValueImpl &activation);
-
- inline const QScriptInstruction *instructionPointer();
- inline void setInstructionPointer(const QScriptInstruction *instructionPointer);
-
- inline const QScriptValueImpl *baseStackPointer() const;
- inline const QScriptValueImpl *currentStackPointer() const;
-
- inline QScriptContext::ExecutionState state() const;
-
-public:
- QScriptContextPrivate *previous;
- int argc;
- QScriptContext::ExecutionState m_state;
-
- QScriptValueImpl m_activation;
- QScriptValueImpl m_thisObject;
- QScriptValueImpl m_result;
- QScriptValueImpl m_scopeChain;
- QScriptValueImpl m_callee;
- QScriptValueImpl m_arguments;
-
- QScriptValueImpl *args;
- QScriptValueImpl *tempStack;
- QScriptValueImpl *stackPtr;
-
- QScript::Code *m_code;
- const QScriptInstruction *iPtr;
- const QScriptInstruction *firstInstruction;
- const QScriptInstruction *lastInstruction;
-
- int currentLine;
- int currentColumn;
-
- int errorLineNumber;
-
- bool catching;
- bool m_calledAsConstructor;
-
- int calleeMetaIndex;
-
- QScriptContext *q_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif
diff --git a/src/script/qscriptcontextinfo_p.h b/src/script/qscriptcontextinfo_p.h
deleted file mode 100644
index 775a81c..0000000
--- a/src/script/qscriptcontextinfo_p.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTCONTEXTINFO_P_H
-#define QSCRIPTCONTEXTINFO_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptcontextinfo.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/qatomic.h>
-#include <QtCore/qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-class QScriptContext;
-
-class QScriptContextInfo;
-class QScriptContextInfoPrivate
-{
- Q_DECLARE_PUBLIC(QScriptContextInfo)
-public:
- QScriptContextInfoPrivate();
- QScriptContextInfoPrivate(const QScriptContext *context);
- ~QScriptContextInfoPrivate();
-
- qint64 scriptId;
- int lineNumber;
- int columnNumber;
- QString fileName;
-
- QString functionName;
- QScriptContextInfo::FunctionType functionType;
-
- int functionStartLineNumber;
- int functionEndLineNumber;
- int functionMetaIndex;
-
- QStringList parameterNames;
-
- QBasicAtomicInt ref;
-
- QScriptContextInfo *q_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptecmaarray.cpp b/src/script/qscriptecmaarray.cpp
deleted file mode 100644
index d068ba6..0000000
--- a/src/script/qscriptecmaarray.cpp
+++ /dev/null
@@ -1,777 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmaarray_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptclassdata_p.h"
-
-#include <QtCore/QtDebug>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class ArrayClassData: public QScriptClassData
-{
- QScriptClassInfo *m_classInfo;
-
-public:
- ArrayClassData(QScriptClassInfo *classInfo);
- virtual ~ArrayClassData();
-
- inline QScriptClassInfo *classInfo() const
- { return m_classInfo; }
-
- virtual void mark(const QScriptValueImpl &object, int generation);
- virtual bool resolve(const QScriptValueImpl &object,
- QScriptNameIdImpl *nameId,
- QScript::Member *member,
- QScriptValueImpl *base,
- QScript::AccessMode mode);
- virtual bool get(const QScriptValueImpl &obj, const Member &m,
- QScriptValueImpl *out_value);
- virtual bool put(QScriptValueImpl *object, const Member &member,
- const QScriptValueImpl &value);
- virtual bool removeMember(const QScriptValueImpl &object,
- const QScript::Member &member);
- virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object);
-};
-
-class ArrayClassDataIterator: public QScriptClassDataIterator
-{
-public:
- ArrayClassDataIterator(Array::Instance *instance);
- virtual ~ArrayClassDataIterator();
-
- virtual bool hasNext() const;
- virtual void next(QScript::Member *member);
-
- virtual bool hasPrevious() const;
- virtual void previous(QScript::Member *member);
-
- virtual void toFront();
- virtual void toBack();
-
-private:
- Array::Instance *m_instance;
- QList<uint> m_keys;
- quint32 m_pos;
-};
-
-ArrayClassData::ArrayClassData(QScriptClassInfo *classInfo):
- m_classInfo(classInfo)
-{
-}
-
-ArrayClassData::~ArrayClassData()
-{
-}
-
-void ArrayClassData::mark(const QScriptValueImpl &object, int generation)
-{
- Array::Instance *instance = Array::Instance::get(object, classInfo());
- if (! instance)
- return;
-
- instance->value.mark(generation);
-}
-
-bool ArrayClassData::resolve(const QScriptValueImpl &object,
- QScriptNameIdImpl *nameId,
- QScript::Member *member,
- QScriptValueImpl *base,
- QScript::AccessMode access)
-{
- QScriptEnginePrivate *eng_p = object.engine();
-
- Array::Instance *instance = Array::Instance::get(object, classInfo());
- if (!instance)
- return false;
-
- if (nameId == eng_p->idTable()->id_length) {
- member->native(nameId, /*id=*/ 0,
- QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration);
- *base = object;
- return true;
- }
-
- QString propertyName = eng_p->toString(nameId);
- bool isNumber;
- quint32 pos = propertyName.toUInt(&isNumber);
-
- if (!isNumber || (pos == 0xFFFFFFFF)
- || (QScriptValueImpl(pos).toString() != propertyName)) { // ### improve me
- return false;
- }
-
- if ((access == QScript::Read) && ((pos >= instance->value.count()) || !instance->value.at(pos).isValid()))
- return false;
-
- member->native(0, pos, /*flags=*/0);
- *base = object;
- return true;
-}
-
-bool ArrayClassData::get(const QScriptValueImpl &object,
- const QScript::Member &member,
- QScriptValueImpl *result)
-{
- Q_ASSERT(member.isValid());
-
- if (! member.isNativeProperty())
- return false;
-
- QScriptEnginePrivate *eng = object.engine();
-
- Array::Instance *instance = Array::Instance::get(object, classInfo());
- if (! instance)
- return false;
-
- if (member.nameId() == eng->idTable()->id_length)
- *result = QScriptValueImpl(instance->value.count());
-
- else {
- quint32 pos = quint32 (member.id());
-
- if (pos < instance->value.count())
- *result = instance->value.at(pos);
- else
- *result = eng->undefinedValue();
- }
-
- return true;
-}
-
-bool ArrayClassData::put(QScriptValueImpl *object,
- const QScript::Member &member,
- const QScriptValueImpl &value)
-{
- Q_ASSERT(object != 0);
- Q_ASSERT(member.isValid());
-
- if (! member.isNativeProperty())
- return false;
-
- Array::Instance *instance = Array::Instance::get(*object, classInfo());
- if (! instance)
- return false;
-
- QScriptEnginePrivate *eng_p = object->engine();
-
- if (member.nameId() == eng_p->idTable()->id_length) {
- qsreal length = value.toNumber();
- quint32 len = eng_p->toUint32(length);
- instance->value.resize(len);
- }
-
- else if (member.nameId() == 0) {
- quint32 pos = quint32 (member.id());
- instance->value.assign(pos, value);
- }
-
- return true;
-}
-
-bool ArrayClassData::removeMember(const QScriptValueImpl &object,
- const QScript::Member &member)
-{
- if (!member.isNativeProperty() || !member.isDeletable() || (member.nameId() != 0))
- return false;
-
- Array::Instance *instance = Array::Instance::get(object, classInfo());
- if (! instance)
- return false;
-
- quint32 pos = quint32 (member.id());
- if (instance->value.at(pos).isValid())
- instance->value.assign(pos, QScriptValueImpl());
- return true;
-}
-
-QScriptClassDataIterator *ArrayClassData::newIterator(const QScriptValueImpl &object)
-{
- Array::Instance *instance = Array::Instance::get(object, classInfo());
- return new ArrayClassDataIterator(instance);
-}
-
-ArrayClassDataIterator::ArrayClassDataIterator(Array::Instance *instance)
-{
- m_instance = instance;
- toFront();
-}
-
-ArrayClassDataIterator::~ArrayClassDataIterator()
-{
-}
-
-bool ArrayClassDataIterator::hasNext() const
-{
- quint32 limit = m_keys.isEmpty() ? m_instance->value.size() : quint32(m_keys.size());
- for (quint32 i = m_pos; i < limit; ++i) {
- quint32 realI = m_keys.isEmpty() ? i : m_keys.at(i);
- if (m_instance->value.at(realI).isValid())
- return true;
- }
- return false;
-}
-
-void ArrayClassDataIterator::next(QScript::Member *member)
-{
- quint32 limit = m_keys.isEmpty() ? m_instance->value.size() : quint32(m_keys.size());
- for (quint32 i = m_pos; i < limit; ++i) {
- quint32 realI = m_keys.isEmpty() ? i : m_keys.at(i);
- if (m_instance->value.at(realI).isValid()) {
- member->native(/*nameId=*/0, realI, /*flags=*/0);
- m_pos = i + 1;
- return;
- }
- }
- member->invalidate();
-}
-
-bool ArrayClassDataIterator::hasPrevious() const
-{
- for (quint32 i = m_pos - 1; i != 0xFFFFFFFF; --i) {
- quint32 realI = m_keys.isEmpty() ? i : m_keys.at(i);
- if (m_instance->value.at(realI).isValid())
- return true;
- }
- return false;
-}
-
-void ArrayClassDataIterator::previous(QScript::Member *member)
-{
- for (quint32 i = m_pos - 1; i != 0xFFFFFFFF; --i) {
- quint32 realI = m_keys.isEmpty() ? i : m_keys.at(i);
- if (m_instance->value.at(realI).isValid()) {
- member->native(/*nameId=*/ 0, realI, /*flags=*/0);
- m_pos = i;
- return;
- }
- }
- member->invalidate();
-}
-
-void ArrayClassDataIterator::toFront()
-{
- m_keys = m_instance->value.keys();
- m_pos = 0;
-}
-
-void ArrayClassDataIterator::toBack()
-{
- m_keys = m_instance->value.keys();
- m_pos = m_keys.isEmpty() ? m_instance->value.count() : m_keys.size();
-}
-
-
-
-Array::Array(QScriptEnginePrivate *eng):
- Core(eng, QLatin1String("Array"), QScriptClassInfo::ArrayType)
-{
- classInfo()->setData(new ArrayClassData(classInfo()));
-
- newArray(&publicPrototype, QScript::Array(eng));
-
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
- addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 0);
- addPrototypeFunction(QLatin1String("concat"), method_concat, 1);
- addPrototypeFunction(QLatin1String("join"), method_join, 1);
- addPrototypeFunction(QLatin1String("pop"), method_pop, 0);
- addPrototypeFunction(QLatin1String("push"), method_push, 1);
- addPrototypeFunction(QLatin1String("reverse"), method_reverse, 0);
- addPrototypeFunction(QLatin1String("shift"), method_shift, 0);
- addPrototypeFunction(QLatin1String("slice"), method_slice, 2);
- addPrototypeFunction(QLatin1String("sort"), method_sort, 1);
- addPrototypeFunction(QLatin1String("splice"), method_splice, 2);
- addPrototypeFunction(QLatin1String("unshift"), method_unshift, 1);
-}
-
-Array::~Array()
-{
-}
-
-void Array::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- QScript::Array value(engine());
-
- if (context->argumentCount() == 1 && context->argument(0).isNumber()) {
- qsreal size = context->argument(0).toNumber();
- quint32 isize = QScriptEnginePrivate::toUint32(size);
-
- if (size != qsreal(isize)) {
- context->throwError(QScriptContext::RangeError, QLatin1String("invalid array length"));
- return;
- }
-
- value.resize(isize);
- } else {
- for (int i = 0; i < context->argumentCount(); ++i) {
- value.assign(i, context->argument(i));
- }
- }
-
- if (context->isCalledAsConstructor()) {
- QScriptValueImpl &object = context->m_thisObject;
- object.setClassInfo(classInfo());
- object.setPrototype(publicPrototype);
- initArray(&object, value);
- } else {
- newArray(&context->m_result, value);
- }
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-void Array::newArray(QScriptValueImpl *result, const QScript::Array &value)
-{
- engine()->newObject(result, publicPrototype, classInfo());
- initArray(result, value);
-}
-
-void Array::initArray(QScriptValueImpl *result, const QScript::Array &value)
-{
- Instance *instance = new Instance(engine());
- instance->value = value;
- result->setObjectData(instance);
-}
-
-QScriptValueImpl Array::method_toString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- return method_join(context, eng, classInfo); // ### fixme
-}
-
-QScriptValueImpl Array::method_toLocaleString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- return method_toString(context, eng, classInfo);
-}
-
-QScriptValueImpl Array::method_concat(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- QScript::Array result(eng);
-
- if (Instance *instance = Instance::get(context->thisObject(), classInfo))
- result = instance->value;
-
- else {
- QString v = context->thisObject().toString();
- result.assign(0, QScriptValueImpl(eng, v));
- }
-
- for (int i = 0; i < context->argumentCount(); ++i) {
- quint32 k = result.size();
- QScriptValueImpl arg = context->argument(i);
-
- if (Instance *elt = Instance::get(arg, classInfo))
- result.concat(elt->value);
-
- else
- result.assign(k, QScriptValueImpl(eng, arg.toString()));
- }
-
- return eng->newArray(result);
-}
-
-QScriptValueImpl Array::method_join(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QScriptValueImpl arg = context->argument(0);
-
- QString r4;
- if (arg.isUndefined())
- r4 = QLatin1String(",");
- else
- r4 = arg.toString();
-
- QScriptValueImpl self = context->thisObject();
-
- QScriptNameIdImpl *id_length = eng->idTable()->id_length;
- QScriptValueImpl length = self.property(id_length);
- qsreal r1 = length.isValid() ? length.toNumber() : 0;
- quint32 r2 = QScriptEnginePrivate::toUint32(r1);
-
- if (! r2)
- return QScriptValueImpl(eng, QString());
-
- if (eng->visitedArrayElements.contains(self.objectValue())) {
- // avoid infinite recursion
- return QScriptValueImpl(eng, QString());
- }
- eng->visitedArrayElements.insert(self.objectValue());
-
- QString R;
-
- QScriptValueImpl r6 = self.property(QLatin1String("0"));
- if (r6.isValid() && !(r6.isUndefined() || r6.isNull()))
- R = r6.toString();
-
- for (quint32 k = 1; k < r2; ++k) {
- R += r4;
-
- QScriptNameIdImpl *name = eng->nameId(QScriptValueImpl(k).toString());
- QScriptValueImpl r12 = self.property(name);
-
- if (r12.isValid() && ! (r12.isUndefined() || r12.isNull()))
- R += r12.toString();
- }
-
- eng->visitedArrayElements.remove(self.objectValue());
- return QScriptValueImpl(eng, R);
-}
-
-QScriptValueImpl Array::method_pop(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (Instance *instance = Instance::get(self, classInfo)) {
- QScriptValueImpl elt = instance->value.pop();
- if (! elt.isValid())
- elt = eng->undefinedValue();
-
- return elt;
- }
-
- QScriptNameIdImpl *id_length = eng->idTable()->id_length;
-
- QScriptValueImpl r1 = self.property(id_length);
- quint32 r2 = r1.toUInt32();
- if (! r2) {
- self.setProperty(id_length, QScriptValueImpl(0));
- return eng->undefinedValue();
- }
- QScriptNameIdImpl *r6 = eng->nameId(QScriptValueImpl(r2 - 1).toString());
- QScriptValueImpl r7 = self.property(r6);
- self.deleteProperty(r6);
- self.setProperty(id_length, QScriptValueImpl(r2 - 1));
- if (!r7.isValid())
- return eng->undefinedValue();
- return r7;
-}
-
-QScriptValueImpl Array::method_push(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (Instance *instance = Instance::get(self, classInfo)) {
- uint pos = instance->value.size();
- for (int i = 0; i < context->argumentCount(); ++i) {
- QScriptValueImpl val = context->argument(i);
- if (pos == 0xFFFFFFFF) {
- self.setProperty(pos++, val);
- self.setProperty(eng->idTable()->id_length, 0);
- } else {
- instance->value.assign(pos++, val);
- }
- }
- return QScriptValueImpl(pos);
- }
-
- QScriptNameIdImpl *id_length = eng->idTable()->id_length;
- QScriptValueImpl r1 = self.property(id_length);
- quint32 n = r1.toUInt32();
- for (int index = 0; index < context->argumentCount(); ++index, ++n) {
- QScriptValueImpl r3 = context->argument(index);
- QScriptNameIdImpl *name = eng->nameId(QScriptValueImpl(n).toString());
- self.setProperty(name, r3);
- }
- QScriptValueImpl r(n);
- self.setProperty(id_length, r);
- return r;
-}
-
-QScriptValueImpl Array::method_reverse(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (Instance *instance = Instance::get(self, classInfo)) {
- int lo = 0, hi = instance->value.count () - 1;
-
- for (; lo < hi; ++lo, --hi) {
- QScriptValueImpl tmp = instance->value.at(lo);
- instance->value.assign(lo, instance->value.at(hi));
- instance->value.assign(hi, tmp);
- }
-
- } else {
- QScriptNameIdImpl *id_length = eng->idTable()->id_length;
-
- QScriptValueImpl lengthValue = self.property(id_length);
- quint32 length = 0;
- if (lengthValue.isValid())
- length = QScriptEnginePrivate::toUint32(lengthValue.toNumber());
- const quint32 m = length / 2;
- for (quint32 i = 0; i < m; ++i) {
- quint32 j = length - i - 1;
-
- QScriptNameIdImpl *iid = eng->nameId(QScriptValueImpl(i).toString());
- QScriptNameIdImpl *jid = eng->nameId(QScriptValueImpl(j).toString());
-
- QScript::Member imember;
- QScriptValueImpl ibase;
- QScriptValueImpl ival;
- bool iok = self.resolve(iid, &imember, &ibase, QScriptValue::ResolvePrototype, QScript::ReadWrite);
- if (iok)
- ibase.get(iid, &ival);
- else
- ival = eng->undefinedValue();
-
- QScript::Member jmember;
- QScriptValueImpl jbase;
- QScriptValueImpl jval;
- bool jok = self.resolve(jid, &jmember, &jbase, QScriptValue::ResolvePrototype, QScript::ReadWrite);
- if (jok)
- jbase.get(jid, &jval);
- else
- jval = eng->undefinedValue();
-
- if (!jok) {
- if (iok) {
- if (eng->strictlyEquals(ibase, self))
- ibase.removeMember(imember);
- self.setProperty(jid, ival);
- }
- } else if (!iok) {
- self.setProperty(iid, jval);
- if (eng->strictlyEquals(jbase, self))
- jbase.removeMember(jmember);
- } else {
- if (eng->strictlyEquals(self, ibase))
- self.put(imember, jval);
- else
- self.setProperty(iid, jval);
- if (eng->strictlyEquals(self, jbase))
- self.put(jmember, ival);
- else
- self.setProperty(jid, ival);
- }
- }
- }
-
- return context->thisObject();
-}
-
-QScriptValueImpl Array::method_shift(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QScriptNameIdImpl *id_length = eng->idTable()->id_length;
-
- QScriptValueImpl self = context->thisObject();
- quint32 length = self.property(id_length).toUInt32();
- if (length == 0) {
- self.setProperty(id_length, QScriptValueImpl(0));
- return eng->undefinedValue();
- }
-
- QScript::Member member;
- QScriptValueImpl base;
-
- QScriptValueImpl result = self.property(QLatin1String("0"));
- if (! result.isValid())
- result = eng->undefinedValue();
-
- for (quint32 index = 1; index < length; ++index) {
- QScriptNameIdImpl *k = eng->nameId(QScriptValueImpl(index).toString());
- QScriptNameIdImpl *k1 = eng->nameId(QScriptValueImpl(index - 1).toString());
-
- QScriptValueImpl v = self.property(k);
- QScriptValueImpl v1 = self.property(k1);
-
- if (v.isValid())
- self.setProperty(k1, v);
-
- else if (v1.isValid() && self.resolve(k1, &member, &base, QScriptValue::ResolveLocal, QScript::ReadWrite))
- self.removeMember(member);
- }
-
- QScriptValueImpl len = QScriptValueImpl(length - 1);
-
- if (self.resolve(eng->nameId(len.toString()), &member, &base, QScriptValue::ResolveLocal, QScript::ReadWrite))
- self.removeMember(member);
-
- self.setProperty(id_length, len);
- return (result);
-}
-
-QScriptValueImpl Array::method_slice(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QScript::Array result(eng);
-
- QScriptValueImpl start = context->argument(0);
- QScriptValueImpl end = context->argument(1);
-
- QScriptValueImpl self = context->thisObject();
- QScriptNameIdImpl *id_length = eng->idTable()->id_length;
- qsreal r2 = self.property(id_length).toNumber();
- quint32 r3 = QScriptEnginePrivate::toUint32(r2);
- qint32 r4 = qint32 (start.toInteger());
- quint32 r5 = r4 < 0 ? qMax(quint32(r3 + r4), quint32(0)) : qMin(quint32(r4), r3);
- quint32 k = r5;
- qint32 r7 = end.isUndefined() ? r3 : qint32 (end.toInteger());
- quint32 r8 = r7 < 0 ? qMax(quint32(r3 + r7), quint32(0)) : qMin(quint32(r7), r3);
- quint32 n = 0;
- for (; k < r8; ++k) {
- QString r11 = QScriptValueImpl(k).toString();
- QScriptValueImpl v = self.property(r11);
- if (v.isValid())
- result.assign(n++, v);
- }
- return eng->newArray(result);
-}
-
-QScriptValueImpl Array::method_sort(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- QScriptValueImpl comparefn = context->argument(0);
- if (Instance *instance = Instance::get(self, classInfo)) {
- instance->value.sort(comparefn);
- return context->thisObject();
- }
- return context->throwNotImplemented(QLatin1String("Array.prototype.sort"));
-}
-
-QScriptValueImpl Array::method_splice(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- if (context->argumentCount() < 2)
- return eng->undefinedValue();
-
- QScriptValueImpl self = context->thisObject();
-
- qsreal start = context->argument(0).toInteger();
- qsreal deleteCount = context->argument(1).toInteger();
-
- QScriptValueImpl arrayCtor = eng->globalObject().property(QLatin1String("Array"));
- QScriptValueImpl a = arrayCtor.construct();
-
- if (Instance *instance = Instance::get(self, classInfo)) {
- QVector<QScriptValueImpl> items;
- for (int i = 2; i < context->argumentCount(); ++i)
- items << context->argument(i);
- Instance *otherInstance = Instance::get(a, classInfo);
- Q_ASSERT(otherInstance);
- instance->value.splice(start, deleteCount, items, otherInstance->value);
- return a;
- }
-
- return context->throwNotImplemented(QLatin1String("Array.prototype.splice"));
-}
-
-QScriptValueImpl Array::method_unshift(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QScriptValueImpl self = context->thisObject();
-
- QScriptNameIdImpl *id_length = eng->idTable()->id_length;
- QScriptValueImpl r1 = self.property(id_length);
- quint32 r2 = r1.isValid() ? QScriptEnginePrivate::toUint32(r1.toNumber()) : 0;
- quint32 r3 = quint32 (context->argumentCount());
- quint32 k = r2;
- for (; k != 0; --k) {
- QScriptNameIdImpl *r6 = eng->nameId(QScriptValueImpl(k - 1).toString());
- QScriptNameIdImpl *r7 = eng->nameId(QScriptValueImpl(k + r3 - 1).toString());
- QScriptValueImpl r8 = self.property(r6);
- if (r8.isValid())
- self.setProperty(r7, r8);
-
- else {
- QScript::Member member;
- QScriptValueImpl base;
-
- if (self.resolve(r7, &member, &base, QScriptValue::ResolveLocal, QScript::ReadWrite))
- self.removeMember(member);
- }
- }
-
- for (k = 0; k < r3; ++k) {
- QScriptValueImpl r16 = context->argument(k);
- QScriptNameIdImpl *r17 = eng->nameId(QScriptValueImpl(k).toString());
- self.setProperty(r17, r16);
- }
- QScriptValueImpl r(r2 + r3);
- self.setProperty(id_length, r);
- return (r);
-}
-
-Array::Instance *Array::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass)
-{
- if (! klass || klass == object.classInfo())
- return static_cast<Instance*> (object.objectData());
-
- return 0;
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmaarray_p.h b/src/script/qscriptecmaarray_p.h
deleted file mode 100644
index 7230a92..0000000
--- a/src/script/qscriptecmaarray_p.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMAARRAY_P_H
-#define QSCRIPTECMAARRAY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptarray_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptecmacore_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class Array: public Core
-{
-public:
- Array(QScriptEnginePrivate *engine);
- virtual ~Array();
-
- virtual void execute(QScriptContextPrivate *context);
-
- class Instance: public QScriptObjectData {
- public:
- Instance(QScriptEnginePrivate *engine)
- : value(QScript::Array(engine)) {}
- virtual ~Instance() {}
-
- static Instance *get(const QScriptValueImpl &object,
- QScriptClassInfo *klass);
-
- public: // attributes
- QScript::Array value;
- };
-
- inline Instance *get(const QScriptValueImpl &object) const
- { return Instance::get(object, classInfo()); }
-
- void newArray(QScriptValueImpl *result,
- const QScript::Array &value);
-
-protected:
- static QScriptValueImpl method_toString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLocaleString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_concat(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_join(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_pop(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_push(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_reverse(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_shift(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_slice(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_sort(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_splice(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_unshift(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-
-private:
- void initArray(QScriptValueImpl *result, const QScript::Array &value);
-};
-
-} } // namespace QScript::Ecma
-
-#endif // QT_NO_SCRIPT
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptecmaboolean.cpp b/src/script/qscriptecmaboolean.cpp
deleted file mode 100644
index 08cad66..0000000
--- a/src/script/qscriptecmaboolean.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmaboolean_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QtDebug>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-Boolean::Boolean(QScriptEnginePrivate *eng):
- Core(eng, QLatin1String("Boolean"), QScriptClassInfo::BooleanType)
-{
- newBoolean(&publicPrototype, false);
-
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
- addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0);
-}
-
-Boolean::~Boolean()
-{
-}
-
-void Boolean::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- bool value;
- if (context->argumentCount() > 0)
- value = context->argument(0).toBoolean();
- else
- value = false;
-
- QScriptValueImpl boolean(value);
- if (!context->isCalledAsConstructor()) {
- context->setReturnValue(boolean);
- } else {
- QScriptValueImpl &obj = context->m_thisObject;
- obj.setClassInfo(classInfo());
- obj.setInternalValue(boolean);
- obj.setPrototype(publicPrototype);
- context->setReturnValue(obj);
- }
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-void Boolean::newBoolean(QScriptValueImpl *result, bool value)
-{
- engine()->newObject(result, publicPrototype, classInfo());
- result->setInternalValue(QScriptValueImpl(value));
-}
-
-QScriptValueImpl Boolean::method_toString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("Boolean.prototype.toString"));
- }
- const QScript::IdTable *t = eng->idTable();
- bool v = self.internalValue().toBoolean();
- QScriptValueImpl result;
- eng->newNameId(&result, v ? t->id_true : t->id_false);
- return result;
-}
-
-QScriptValueImpl Boolean::method_valueOf(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("Boolean.prototype.valueOf"));
- }
- return self.internalValue();
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmaboolean_p.h b/src/script/qscriptecmaboolean_p.h
deleted file mode 100644
index 4dbaa27..0000000
--- a/src/script/qscriptecmaboolean_p.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMABOOLEAN_P_H
-#define QSCRIPTECMABOOLEAN_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptecmacore_p.h"
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SCRIPT
-
-namespace QScript { namespace Ecma {
-
-class Boolean: public Core
-{
-public:
- Boolean(QScriptEnginePrivate *engine);
- virtual ~Boolean();
-
- virtual void execute(QScriptContextPrivate *context);
-
- void newBoolean(QScriptValueImpl *result, bool value = false);
-
-protected:
- static QScriptValueImpl method_toString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_valueOf(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-};
-
-} } // namespace QScript::Ecma
-
-#endif // QT_NO_SCRIPT
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptecmacore.cpp b/src/script/qscriptecmacore.cpp
deleted file mode 100644
index ed0fce1..0000000
--- a/src/script/qscriptecmacore.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmacore_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-Core::Core(QScriptEnginePrivate *engine, const QString &className,
- QScriptClassInfo::Type type)
- : m_engine(engine)
-{
- m_classInfo = engine->registerClass(className, type);
- this->length = 1;
-}
-
-Core::Core(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo)
- : m_engine(engine), m_classInfo(classInfo)
-{
- this->length = 1;
-}
-
-Core::~Core()
-{
-}
-
-void Core::addPrototypeFunction(const QString &name, QScriptInternalFunctionSignature fun,
- int length, const QScriptValue::PropertyFlags flags)
-{
- addFunction(publicPrototype, name, fun, length, flags);
-}
-
-void Core::addConstructorFunction(const QString &name, QScriptInternalFunctionSignature fun,
- int length, const QScriptValue::PropertyFlags flags)
-{
- addFunction(ctor, name, fun, length, flags);
-}
-
-void Core::addFunction(QScriptValueImpl &object, const QString &name,
- QScriptInternalFunctionSignature fun, int length,
- const QScriptValue::PropertyFlags flags)
-{
- QScriptValueImpl val = engine()->createFunction(fun, length, m_classInfo, name);
- object.setProperty(name, val, flags);
-}
-
-QString Core::functionName() const
-{
- return m_classInfo->name();
-}
-
-void Core::mark(QScriptEnginePrivate *eng, int generation)
-{
- QScriptFunction::mark(eng, generation);
- eng->markObject(ctor, generation);
- eng->markObject(publicPrototype, generation);
-}
-
-QScriptValueImpl Core::throwThisObjectTypeError(QScriptContextPrivate *context,
- const QString &functionName)
-{
- return context->throwError(QScriptContext::TypeError,
- QString::fromLatin1("%0 called on incompatible object")
- .arg(functionName));
-}
-
-} // namespace Ecma
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmacore_p.h b/src/script/qscriptecmacore_p.h
deleted file mode 100644
index b4c1780..0000000
--- a/src/script/qscriptecmacore_p.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMACORE_P_H
-#define QSCRIPTECMACORE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptfunction_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptvalueimplfwd_p.h"
-#include "qscriptclassinfo_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class Core: public QScriptFunction
-{
-public:
- Core(QScriptEnginePrivate *engine, const QString &className,
- QScriptClassInfo::Type type);
- Core(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo);
- virtual ~Core();
-
- inline QScriptEnginePrivate *engine() const
- { return m_engine; }
-
- inline QScriptClassInfo *classInfo() const
- { return m_classInfo; }
-
- void addPrototypeFunction(
- const QString &name, QScriptInternalFunctionSignature fun, int length,
- const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration);
- void addConstructorFunction(
- const QString &name, QScriptInternalFunctionSignature fun, int length,
- const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration);
-
- QString functionName() const;
-
- virtual void mark(QScriptEnginePrivate *eng, int generation);
-
-public: // attributes
- QScriptValueImpl ctor;
- QScriptValueImpl publicPrototype;
-
-protected:
- static QScriptValueImpl throwThisObjectTypeError(
- QScriptContextPrivate *context, const QString &functionName);
-
-private:
- void addFunction(QScriptValueImpl &object, const QString &name,
- QScriptInternalFunctionSignature fun, int length,
- const QScriptValue::PropertyFlags flags);
-
- QScriptEnginePrivate *m_engine;
- QScriptClassInfo *m_classInfo;
-};
-
-} } // namespace QScript::Ecma
-
-#endif // QT_NO_SCRIPT
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptecmadate.cpp b/src/script/qscriptecmadate.cpp
deleted file mode 100644
index cc80383..0000000
--- a/src/script/qscriptecmadate.cpp
+++ /dev/null
@@ -1,1281 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmadate_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QDateTime>
-#include <QtCore/QRegExp>
-#include <QtCore/QtDebug>
-#include <QtCore/QLocale>
-#include <QtCore/qnumeric.h>
-
-#include <math.h>
-
-#ifndef Q_WS_WIN
-# include <time.h>
-# include <sys/time.h>
-#else
-# include <windows.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-static const qsreal HoursPerDay = 24.0;
-static const qsreal MinutesPerHour = 60.0;
-static const qsreal SecondsPerMinute = 60.0;
-static const qsreal msPerSecond = 1000.0;
-static const qsreal msPerMinute = 60000.0;
-static const qsreal msPerHour = 3600000.0;
-static const qsreal msPerDay = 86400000.0;
-
-static qsreal LocalTZA = 0.0; // initialized at startup
-
-static inline qsreal TimeWithinDay(qsreal t)
-{
- qsreal r = ::fmod(t, msPerDay);
- return (r >= 0) ? r : r + msPerDay;
-}
-
-static inline int HourFromTime(qsreal t)
-{
- int r = int(::fmod(::floor(t / msPerHour), HoursPerDay));
- return (r >= 0) ? r : r + int(HoursPerDay);
-}
-
-static inline int MinFromTime(qsreal t)
-{
- int r = int(::fmod(::floor(t / msPerMinute), MinutesPerHour));
- return (r >= 0) ? r : r + int(MinutesPerHour);
-}
-
-static inline int SecFromTime(qsreal t)
-{
- int r = int(::fmod(::floor(t / msPerSecond), SecondsPerMinute));
- return (r >= 0) ? r : r + int(SecondsPerMinute);
-}
-
-static inline int msFromTime(qsreal t)
-{
- int r = int(::fmod(t, msPerSecond));
- return (r >= 0) ? r : r + int(msPerSecond);
-}
-
-static inline qsreal Day(qsreal t)
-{
- return ::floor(t / msPerDay);
-}
-
-static inline qsreal DaysInYear(qsreal y)
-{
- if (::fmod(y, 4))
- return 365;
-
- else if (::fmod(y, 100))
- return 366;
-
- else if (::fmod(y, 400))
- return 365;
-
- return 366;
-}
-
-static inline qsreal DayFromYear(qsreal y)
-{
- return 365 * (y - 1970)
- + ::floor((y - 1969) / 4)
- - ::floor((y - 1901) / 100)
- + ::floor((y - 1601) / 400);
-}
-
-static inline qsreal TimeFromYear(qsreal y)
-{
- return msPerDay * DayFromYear(y);
-}
-
-static inline qsreal YearFromTime(qsreal t)
-{
- int y = 1970;
- y += (int) ::floor(t / (msPerDay * 365.2425));
-
- qsreal t2 = TimeFromYear(y);
- return (t2 > t) ? y - 1 : ((t2 + msPerDay * DaysInYear(y)) <= t) ? y + 1 : y;
-}
-
-static inline bool InLeapYear(qsreal t)
-{
- qsreal x = DaysInYear(YearFromTime(t));
- if (x == 365)
- return 0;
-
- Q_ASSERT (x == 366);
- return 1;
-}
-
-static inline qsreal DayWithinYear(qsreal t)
-{
- return Day(t) - DayFromYear(YearFromTime(t));
-}
-
-static inline qsreal MonthFromTime(qsreal t)
-{
- qsreal d = DayWithinYear(t);
- qsreal l = InLeapYear(t);
-
- if (d < 31.0)
- return 0;
-
- else if (d < 59.0 + l)
- return 1;
-
- else if (d < 90.0 + l)
- return 2;
-
- else if (d < 120.0 + l)
- return 3;
-
- else if (d < 151.0 + l)
- return 4;
-
- else if (d < 181.0 + l)
- return 5;
-
- else if (d < 212.0 + l)
- return 6;
-
- else if (d < 243.0 + l)
- return 7;
-
- else if (d < 273.0 + l)
- return 8;
-
- else if (d < 304.0 + l)
- return 9;
-
- else if (d < 334.0 + l)
- return 10;
-
- else if (d < 365.0 + l)
- return 11;
-
- return qSNaN(); // ### assert?
-}
-
-static inline qsreal DateFromTime(qsreal t)
-{
- int m = (int) QScriptEnginePrivate::toInteger(MonthFromTime(t));
- qsreal d = DayWithinYear(t);
- qsreal l = InLeapYear(t);
-
- switch (m) {
- case 0: return d + 1.0;
- case 1: return d - 30.0;
- case 2: return d - 58.0 - l;
- case 3: return d - 89.0 - l;
- case 4: return d - 119.0 - l;
- case 5: return d - 150.0 - l;
- case 6: return d - 180.0 - l;
- case 7: return d - 211.0 - l;
- case 8: return d - 242.0 - l;
- case 9: return d - 272.0 - l;
- case 10: return d - 303.0 - l;
- case 11: return d - 333.0 - l;
- }
-
- return qSNaN(); // ### assert
-}
-
-static inline qsreal WeekDay(qsreal t)
-{
- qsreal r = ::fmod (Day(t) + 4.0, 7.0);
- return (r >= 0) ? r : r + 7.0;
-}
-
-
-static inline qsreal MakeTime(qsreal hour, qsreal min, qsreal sec, qsreal ms)
-{
- return ((hour * MinutesPerHour + min) * SecondsPerMinute + sec) * msPerSecond + ms;
-}
-
-static inline qsreal DayFromMonth(qsreal month, qsreal leap)
-{
- switch ((int) month) {
- case 0: return 0;
- case 1: return 31.0;
- case 2: return 59.0 + leap;
- case 3: return 90.0 + leap;
- case 4: return 120.0 + leap;
- case 5: return 151.0 + leap;
- case 6: return 181.0 + leap;
- case 7: return 212.0 + leap;
- case 8: return 243.0 + leap;
- case 9: return 273.0 + leap;
- case 10: return 304.0 + leap;
- case 11: return 334.0 + leap;
- }
-
- return qSNaN(); // ### assert?
-}
-
-static qsreal MakeDay(qsreal year, qsreal month, qsreal day)
-{
- year += ::floor(month / 12.0);
-
- month = ::fmod(month, 12.0);
- if (month < 0)
- month += 12.0;
-
- qsreal t = TimeFromYear(year);
- qsreal leap = InLeapYear(t);
-
- day += ::floor(t / msPerDay);
- day += DayFromMonth(month, leap);
-
- return day - 1;
-}
-
-static inline qsreal MakeDate(qsreal day, qsreal time)
-{
- return day * msPerDay + time;
-}
-
-static inline qsreal DaylightSavingTA(double t)
-{
-#ifndef Q_WS_WIN
- long int tt = (long int)(t / msPerSecond);
- struct tm *tmtm = localtime((const time_t*)&tt);
- if (! tmtm)
- return 0;
- return (tmtm->tm_isdst > 0) ? msPerHour : 0;
-#else
- Q_UNUSED(t);
- /// ### implement me
- return 0;
-#endif
-}
-
-static inline qsreal LocalTime(qsreal t)
-{
- return t + LocalTZA + DaylightSavingTA(t);
-}
-
-static inline qsreal UTC(qsreal t)
-{
- return t - LocalTZA - DaylightSavingTA(t - LocalTZA);
-}
-
-static inline qsreal currentTime()
-{
-#ifndef Q_WS_WIN
- struct timeval tv;
-
- gettimeofday(&tv, 0);
- return ::floor(tv.tv_sec * msPerSecond + (tv.tv_usec / 1000.0));
-#else
- SYSTEMTIME st;
- GetSystemTime(&st);
- FILETIME ft;
- SystemTimeToFileTime(&st, &ft);
- LARGE_INTEGER li;
- li.LowPart = ft.dwLowDateTime;
- li.HighPart = ft.dwHighDateTime;
- return double(li.QuadPart - Q_INT64_C(116444736000000000)) / 10000.0;
-#endif
-}
-
-static inline qsreal TimeClip(qsreal t)
-{
- if (! qIsFinite(t) || fabs(t) > 8.64e15)
- return qSNaN();
- return QScriptEnginePrivate::toInteger(t);
-}
-
-static inline qsreal FromDateTime(const QDateTime &dt)
-{
- if (!dt.isValid())
- return qSNaN();
- QDate date = dt.date();
- QTime taim = dt.time();
- int year = date.year();
- int month = date.month() - 1;
- int day = date.day();
- int hours = taim.hour();
- int mins = taim.minute();
- int secs = taim.second();
- int ms = taim.msec();
- double t = MakeDate(MakeDay(year, month, day),
- MakeTime(hours, mins, secs, ms));
- if (dt.timeSpec() == Qt::LocalTime)
- t = UTC(t);
- return TimeClip(t);
-}
-
-static inline qsreal ParseString(const QString &s)
-{
- QDateTime dt = QDateTime::fromString(s, Qt::TextDate);
- if (!dt.isValid())
- dt = QDateTime::fromString(s, Qt::ISODate);
- if (!dt.isValid()) {
- QStringList formats;
- formats << QLatin1String("M/d/yyyy")
- << QLatin1String("M/d/yyyy hh:mm")
- << QLatin1String("M/d/yyyy hh:mm A")
-
- << QLatin1String("M/d/yyyy, hh:mm")
- << QLatin1String("M/d/yyyy, hh:mm A")
-
- << QLatin1String("MMM d yyyy")
- << QLatin1String("MMM d yyyy hh:mm")
- << QLatin1String("MMM d yyyy hh:mm:ss")
- << QLatin1String("MMM d yyyy, hh:mm")
- << QLatin1String("MMM d yyyy, hh:mm:ss")
-
- << QLatin1String("MMMM d yyyy")
- << QLatin1String("MMMM d yyyy hh:mm")
- << QLatin1String("MMMM d yyyy hh:mm:ss")
- << QLatin1String("MMMM d yyyy, hh:mm")
- << QLatin1String("MMMM d yyyy, hh:mm:ss")
-
- << QLatin1String("MMM d, yyyy")
- << QLatin1String("MMM d, yyyy hh:mm")
- << QLatin1String("MMM d, yyyy hh:mm:ss")
-
- << QLatin1String("MMMM d, yyyy")
- << QLatin1String("MMMM d, yyyy hh:mm")
- << QLatin1String("MMMM d, yyyy hh:mm:ss")
-
- << QLatin1String("d MMM yyyy")
- << QLatin1String("d MMM yyyy hh:mm")
- << QLatin1String("d MMM yyyy hh:mm:ss")
- << QLatin1String("d MMM yyyy, hh:mm")
- << QLatin1String("d MMM yyyy, hh:mm:ss")
-
- << QLatin1String("d MMMM yyyy")
- << QLatin1String("d MMMM yyyy hh:mm")
- << QLatin1String("d MMMM yyyy hh:mm:ss")
- << QLatin1String("d MMMM yyyy, hh:mm")
- << QLatin1String("d MMMM yyyy, hh:mm:ss")
-
- << QLatin1String("d MMM, yyyy")
- << QLatin1String("d MMM, yyyy hh:mm")
- << QLatin1String("d MMM, yyyy hh:mm:ss")
-
- << QLatin1String("d MMMM, yyyy")
- << QLatin1String("d MMMM, yyyy hh:mm")
- << QLatin1String("d MMMM, yyyy hh:mm:ss");
-
- for (int i = 0; i < formats.size(); ++i) {
- dt = QDateTime::fromString(s, formats.at(i));
- if (dt.isValid())
- break;
- }
- }
- return FromDateTime(dt);
-}
-
-/*!
- \internal
-
- Converts the ECMA Date value \tt (in UTC form) to QDateTime
- according to \a spec.
-*/
-static inline QDateTime ToDateTime(qsreal t, Qt::TimeSpec spec)
-{
- if (qIsNaN(t))
- return QDateTime();
- if (spec == Qt::LocalTime)
- t = LocalTime(t);
- int year = int(YearFromTime(t));
- int month = int(MonthFromTime(t) + 1);
- int day = int(DateFromTime(t));
- int hours = HourFromTime(t);
- int mins = MinFromTime(t);
- int secs = SecFromTime(t);
- int ms = msFromTime(t);
- return QDateTime(QDate(year, month, day), QTime(hours, mins, secs, ms), spec);
-}
-
-static inline QString ToString(qsreal t)
-{
- if (qIsNaN(t))
- return QLatin1String("Invalid Date");
- QString str = ToDateTime(t, Qt::LocalTime).toString() + QLatin1String(" GMT");
- qsreal tzoffset = LocalTZA + DaylightSavingTA(t);
- if (tzoffset) {
- int hours = static_cast<int>(::fabs(tzoffset) / 1000 / 60 / 60);
- int mins = int(::fabs(tzoffset) / 1000 / 60) % 60;
- str.append(QLatin1Char((tzoffset > 0) ? '+' : '-'));
- if (hours < 10)
- str.append(QLatin1Char('0'));
- str.append(QString::number(hours));
- if (mins < 10)
- str.append(QLatin1Char('0'));
- str.append(QString::number(mins));
- }
- return str;
-}
-
-static inline QString ToUTCString(qsreal t)
-{
- if (qIsNaN(t))
- return QLatin1String("Invalid Date");
- return ToDateTime(t, Qt::UTC).toString() + QLatin1String(" GMT");
-}
-
-static inline QString ToDateString(qsreal t)
-{
- return ToDateTime(t, Qt::LocalTime).date().toString();
-}
-
-static inline QString ToTimeString(qsreal t)
-{
- return ToDateTime(t, Qt::LocalTime).time().toString();
-}
-
-static inline QString ToLocaleString(qsreal t)
-{
- return ToDateTime(t, Qt::LocalTime).toString(Qt::LocaleDate);
-}
-
-static inline QString ToLocaleDateString(qsreal t)
-{
- return ToDateTime(t, Qt::LocalTime).date().toString(Qt::LocaleDate);
-}
-
-static inline QString ToLocaleTimeString(qsreal t)
-{
- return ToDateTime(t, Qt::LocalTime).time().toString(Qt::LocaleDate);
-}
-
-static qsreal getLocalTZA()
-{
-#ifndef Q_WS_WIN
- struct tm* t;
- time_t curr;
- time(&curr);
- t = localtime(&curr);
- time_t locl = mktime(t);
- t = gmtime(&curr);
- time_t globl = mktime(t);
- return double(locl - globl) * 1000.0;
-#else
- TIME_ZONE_INFORMATION tzInfo;
- GetTimeZoneInformation(&tzInfo);
- return -tzInfo.Bias * 60.0 * 1000.0;
-#endif
-}
-
-namespace Ecma {
-
-Date::Date(QScriptEnginePrivate *eng):
- Core(eng, QLatin1String("Date"), QScriptClassInfo::DateType)
-{
- LocalTZA = getLocalTZA();
-
- newDate(&publicPrototype, qSNaN());
-
- eng->newConstructor(&ctor, this, publicPrototype);
- addConstructorFunction(QLatin1String("parse"), method_parse, 1);
- addConstructorFunction(QLatin1String("UTC"), method_UTC, 7);
-
- addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
- addPrototypeFunction(QLatin1String("toDateString"), method_toDateString, 0);
- addPrototypeFunction(QLatin1String("toTimeString"), method_toTimeString, 0);
- addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 0);
- addPrototypeFunction(QLatin1String("toLocaleDateString"), method_toLocaleDateString, 0);
- addPrototypeFunction(QLatin1String("toLocaleTimeString"), method_toLocaleTimeString, 0);
- addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0);
- addPrototypeFunction(QLatin1String("getTime"), method_getTime, 0);
- addPrototypeFunction(QLatin1String("getYear"), method_getYear, 0);
- addPrototypeFunction(QLatin1String("getFullYear"), method_getFullYear, 0);
- addPrototypeFunction(QLatin1String("getUTCFullYear"), method_getUTCFullYear, 0);
- addPrototypeFunction(QLatin1String("getMonth"), method_getMonth, 0);
- addPrototypeFunction(QLatin1String("getUTCMonth"), method_getUTCMonth, 0);
- addPrototypeFunction(QLatin1String("getDate"), method_getDate, 0);
- addPrototypeFunction(QLatin1String("getUTCDate"), method_getUTCDate, 0);
- addPrototypeFunction(QLatin1String("getDay"), method_getDay, 0);
- addPrototypeFunction(QLatin1String("getUTCDay"), method_getUTCDay, 0);
- addPrototypeFunction(QLatin1String("getHours"), method_getHours, 0);
- addPrototypeFunction(QLatin1String("getUTCHours"), method_getUTCHours, 0);
- addPrototypeFunction(QLatin1String("getMinutes"), method_getMinutes, 0);
- addPrototypeFunction(QLatin1String("getUTCMinutes"), method_getUTCMinutes, 0);
- addPrototypeFunction(QLatin1String("getSeconds"), method_getSeconds, 0);
- addPrototypeFunction(QLatin1String("getUTCSeconds"), method_getUTCSeconds, 0);
- addPrototypeFunction(QLatin1String("getMilliseconds"), method_getMilliseconds, 0);
- addPrototypeFunction(QLatin1String("getUTCMilliseconds"), method_getUTCMilliseconds, 0);
- addPrototypeFunction(QLatin1String("getTimezoneOffset"), method_getTimezoneOffset, 0);
- addPrototypeFunction(QLatin1String("setTime"), method_setTime, 1);
- addPrototypeFunction(QLatin1String("setMilliseconds"), method_setMilliseconds, 1);
- addPrototypeFunction(QLatin1String("setUTCMilliseconds"), method_setUTCMilliseconds, 1);
- addPrototypeFunction(QLatin1String("setSeconds"), method_setSeconds, 2);
- addPrototypeFunction(QLatin1String("setUTCSeconds"), method_setUTCSeconds, 2);
- addPrototypeFunction(QLatin1String("setMinutes"), method_setMinutes, 3);
- addPrototypeFunction(QLatin1String("setUTCMinutes"), method_setUTCMinutes, 3);
- addPrototypeFunction(QLatin1String("setHours"), method_setHours, 4);
- addPrototypeFunction(QLatin1String("setUTCHours"), method_setUTCHours, 4);
- addPrototypeFunction(QLatin1String("setDate"), method_setDate, 1);
- addPrototypeFunction(QLatin1String("setUTCDate"), method_setUTCDate, 1);
- addPrototypeFunction(QLatin1String("setMonth"), method_setMonth, 2);
- addPrototypeFunction(QLatin1String("setUTCMonth"), method_setUTCMonth, 2);
- addPrototypeFunction(QLatin1String("setYear"), method_setYear, 1);
- addPrototypeFunction(QLatin1String("setFullYear"), method_setFullYear, 3);
- addPrototypeFunction(QLatin1String("setUTCFullYear"), method_setUTCFullYear, 3);
- addPrototypeFunction(QLatin1String("toUTCString"), method_toUTCString, 0);
- addPrototypeFunction(QLatin1String("toGMTString"), method_toUTCString, 0);
-}
-
-Date::~Date()
-{
-}
-
-void Date::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- if (!context->isCalledAsConstructor()) {
- double t = currentTime();
- context->setReturnValue(QScriptValueImpl(engine(), ToString(t)));
- } else {
- // called as constructor
- qsreal t;
-
- if (context->argumentCount() == 0)
- t = currentTime();
-
- else if (context->argumentCount() == 1) {
- QScriptValueImpl arg = context->argument(0);
- if (arg.isDate())
- arg = arg.internalValue();
- else
- arg = engine()->toPrimitive(arg);
- if (arg.isString())
- t = ParseString(arg.toString());
- else
- t = TimeClip(arg.toNumber());
- }
-
- else { // context->argumentCount() > 1
- qsreal year = context->argument(0).toNumber();
- qsreal month = context->argument(1).toNumber();
- qsreal day = context->argumentCount() >= 3 ? context->argument(2).toNumber() : 1;
- qsreal hours = context->argumentCount() >= 4 ? context->argument(3).toNumber() : 0;
- qsreal mins = context->argumentCount() >= 5 ? context->argument(4).toNumber() : 0;
- qsreal secs = context->argumentCount() >= 6 ? context->argument(5).toNumber() : 0;
- qsreal ms = context->argumentCount() >= 7 ? context->argument(6).toNumber() : 0;
- if (year >= 0 && year <= 99)
- year += 1900;
- t = MakeDate(MakeDay(year, month, day), MakeTime(hours, mins, secs, ms));
- t = TimeClip(UTC(t));
- }
-
- QScriptValueImpl &obj = context->m_thisObject;
- obj.setClassInfo(classInfo());
- obj.setInternalValue(QScriptValueImpl(t));
- obj.setPrototype(publicPrototype);
- context->setReturnValue(obj);
- }
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-void Date::newDate(QScriptValueImpl *result, qsreal t)
-{
- engine()->newObject(result, publicPrototype, classInfo());
- result->setInternalValue(QScriptValueImpl(t));
-}
-
-void Date::newDate(QScriptValueImpl *result, const QDateTime &dt)
-{
- newDate(result, FromDateTime(dt));
-}
-
-void Date::newDate(QScriptValueImpl *result, const QDate &d)
-{
- newDate(result, QDateTime(d));
-}
-
-QDateTime Date::toDateTime(const QScriptValueImpl &date) const
-{
- Q_ASSERT(date.classInfo() == classInfo());
- qsreal t = date.internalValue().toNumber();
- return ToDateTime(t, Qt::LocalTime);
-}
-
-QScriptValueImpl Date::method_parse(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- return QScriptValueImpl(ParseString(context->argument(0).toString()));
-}
-
-QScriptValueImpl Date::method_UTC(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- const int numArgs = context->argumentCount();
- if (numArgs >= 2) {
- qsreal year = context->argument(0).toNumber();
- qsreal month = context->argument(1).toNumber();
- qsreal day = numArgs >= 3 ? context->argument(2).toNumber() : 1;
- qsreal hours = numArgs >= 4 ? context->argument(3).toNumber() : 0;
- qsreal mins = numArgs >= 5 ? context->argument(4).toNumber() : 0;
- qsreal secs = numArgs >= 6 ? context->argument(5).toNumber() : 0;
- qsreal ms = numArgs >= 7 ? context->argument(6).toNumber() : 0;
- if (year >= 0 && year <= 99)
- year += 1900;
- qsreal t = MakeDate(MakeDay(year, month, day),
- MakeTime(hours, mins, secs, ms));
- return QScriptValueImpl(TimeClip(t));
- }
- return (eng->undefinedValue());
-}
-
-QScriptValueImpl Date::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- return QScriptValueImpl(eng, ToString(t));
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.toString"));
-}
-
-QScriptValueImpl Date::method_toDateString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- return QScriptValueImpl(eng, ToDateString(t));
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.toDateString"));
-}
-
-QScriptValueImpl Date::method_toTimeString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- return QScriptValueImpl(eng, ToTimeString(t));
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.toTimeString"));
-}
-
-QScriptValueImpl Date::method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- return QScriptValueImpl(eng, ToLocaleString(t));
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.toLocaleString"));
-}
-
-QScriptValueImpl Date::method_toLocaleDateString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- return QScriptValueImpl(eng, ToLocaleDateString(t));
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.toLocaleDateString"));
-}
-
-QScriptValueImpl Date::method_toLocaleTimeString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- return QScriptValueImpl(eng, ToLocaleTimeString(t));
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.toLocaleTimeString"));
-}
-
-QScriptValueImpl Date::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo)
- return QScriptValueImpl(self.internalValue().toNumber());
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.valueOf"));
-}
-
-QScriptValueImpl Date::method_getTime(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo)
- return QScriptValueImpl(self.internalValue().toNumber());
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getTime"));
-}
-
-QScriptValueImpl Date::method_getYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = YearFromTime(LocalTime(t)) - 1900;
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getYear"));
-}
-
-QScriptValueImpl Date::method_getFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = YearFromTime(LocalTime(t));
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getFullYear"));
-}
-
-QScriptValueImpl Date::method_getUTCFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = YearFromTime(t);
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getUTCFullYear"));
-}
-
-QScriptValueImpl Date::method_getMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = MonthFromTime(LocalTime(t));
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getMonth"));
-}
-
-QScriptValueImpl Date::method_getUTCMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = MonthFromTime(t);
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getUTCMonth"));
-}
-
-QScriptValueImpl Date::method_getDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = DateFromTime(LocalTime(t));
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getDate"));
-}
-
-QScriptValueImpl Date::method_getUTCDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = DateFromTime(t);
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getUTCDate"));
-}
-
-QScriptValueImpl Date::method_getDay(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = WeekDay(LocalTime(t));
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getDay"));
-}
-
-QScriptValueImpl Date::method_getUTCDay(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = WeekDay(t);
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getUTCDay"));
-}
-
-QScriptValueImpl Date::method_getHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = HourFromTime(LocalTime(t));
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getHours"));
-}
-
-QScriptValueImpl Date::method_getUTCHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = HourFromTime(t);
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getUTCHours"));
-}
-
-QScriptValueImpl Date::method_getMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = MinFromTime(LocalTime(t));
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getMinutes"));
-}
-
-QScriptValueImpl Date::method_getUTCMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = MinFromTime(t);
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getUTCMinutes"));
-}
-
-QScriptValueImpl Date::method_getSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = SecFromTime(LocalTime(t));
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getSeconds"));
-}
-
-QScriptValueImpl Date::method_getUTCSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = SecFromTime(t);
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getUTCSeconds"));
-}
-
-QScriptValueImpl Date::method_getMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = msFromTime(LocalTime(t));
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getMilliseconds"));
-}
-
-QScriptValueImpl Date::method_getUTCMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = msFromTime(t);
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getUTCMilliseconds"));
-}
-
-QScriptValueImpl Date::method_getTimezoneOffset(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (! qIsNaN(t))
- t = (t - LocalTime(t)) / msPerMinute;
- return QScriptValueImpl(t);
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.getTimezoneOffset"));
-}
-
-QScriptValueImpl Date::method_setTime(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = TimeClip(context->argument(0).toNumber());
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setTime"));
-}
-
-QScriptValueImpl Date::method_setMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = LocalTime(self.internalValue().toNumber());
- qsreal ms = context->argument(0).toNumber();
- t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms))));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setMilliseconds"));
-}
-
-QScriptValueImpl Date::method_setUTCMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- qsreal ms = context->argument(0).toNumber();
- t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setUTCMilliseconds"));
-}
-
-QScriptValueImpl Date::method_setSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = LocalTime(self.internalValue().toNumber());
- qsreal sec = context->argument(0).toNumber();
- qsreal ms = (context->argumentCount() < 2) ? msFromTime(t) : context->argument(1).toNumber();
- t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), sec, ms))));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setSeconds"));
-}
-
-QScriptValueImpl Date::method_setUTCSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- qsreal sec = context->argument(0).toNumber();
- qsreal ms = (context->argumentCount() < 2) ? msFromTime(t) : context->argument(1).toNumber();
- t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), sec, ms)));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setUTCSeconds"));
-}
-
-QScriptValueImpl Date::method_setMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = LocalTime(self.internalValue().toNumber());
- qsreal min = context->argument(0).toNumber();
- qsreal sec = (context->argumentCount() < 2) ? SecFromTime(t) : context->argument(1).toNumber();
- qsreal ms = (context->argumentCount() < 3) ? msFromTime(t) : context->argument(2).toNumber();
- t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), min, sec, ms))));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setMinutes"));
-}
-
-QScriptValueImpl Date::method_setUTCMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- qsreal min = context->argument(0).toNumber();
- qsreal sec = (context->argumentCount() < 2) ? SecFromTime(t) : context->argument(1).toNumber();
- qsreal ms = (context->argumentCount() < 3) ? msFromTime(t) : context->argument(2).toNumber();
- t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), min, sec, ms)));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setUTCMinutes"));
-}
-
-QScriptValueImpl Date::method_setHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = LocalTime(self.internalValue().toNumber());
- qsreal hour = context->argument(0).toNumber();
- qsreal min = (context->argumentCount() < 2) ? MinFromTime(t) : context->argument(1).toNumber();
- qsreal sec = (context->argumentCount() < 3) ? SecFromTime(t) : context->argument(2).toNumber();
- qsreal ms = (context->argumentCount() < 4) ? msFromTime(t) : context->argument(3).toNumber();
- t = TimeClip(UTC(MakeDate(Day(t), MakeTime(hour, min, sec, ms))));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setHours"));
-}
-
-QScriptValueImpl Date::method_setUTCHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- qsreal hour = context->argument(0).toNumber();
- qsreal min = (context->argumentCount() < 2) ? MinFromTime(t) : context->argument(1).toNumber();
- qsreal sec = (context->argumentCount() < 3) ? SecFromTime(t) : context->argument(2).toNumber();
- qsreal ms = (context->argumentCount() < 4) ? msFromTime(t) : context->argument(3).toNumber();
- t = TimeClip(MakeDate(Day(t), MakeTime(hour, min, sec, ms)));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setUTCHours"));
-}
-
-QScriptValueImpl Date::method_setDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = LocalTime(self.internalValue().toNumber());
- qsreal date = context->argument(0).toNumber();
- t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t))));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setDate"));
-}
-
-QScriptValueImpl Date::method_setUTCDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- qsreal date = context->argument(0).toNumber();
- t = TimeClip(MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t)));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setUTCDate"));
-}
-
-QScriptValueImpl Date::method_setMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = LocalTime(self.internalValue().toNumber());
- qsreal month = context->argument(0).toNumber();
- qsreal date = (context->argumentCount() < 2) ? DateFromTime(t) : context->argument(1).toNumber();
- t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), month, date), TimeWithinDay(t))));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setMonth"));
-}
-
-QScriptValueImpl Date::method_setUTCMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- qsreal month = context->argument(0).toNumber();
- qsreal date = (context->argumentCount() < 2) ? DateFromTime(t) : context->argument(1).toNumber();
- t = TimeClip(MakeDate(MakeDay(YearFromTime(t), month, date), TimeWithinDay(t)));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setUTCMonth"));
-}
-
-QScriptValueImpl Date::method_setFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = LocalTime(self.internalValue().toNumber());
- qsreal year = context->argument(0).toNumber();
- qsreal month = (context->argumentCount() < 2) ? MonthFromTime(t) : context->argument(1).toNumber();
- qsreal date = (context->argumentCount() < 3) ? DateFromTime(t) : context->argument(2).toNumber();
- t = TimeClip(UTC(MakeDate(MakeDay(year, month, date), TimeWithinDay(t))));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setFullYear"));
-}
-
-QScriptValueImpl Date::method_setUTCFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- qsreal year = context->argument(0).toNumber();
- qsreal month = (context->argumentCount() < 2) ? MonthFromTime(t) : context->argument(1).toNumber();
- qsreal date = (context->argumentCount() < 3) ? DateFromTime(t) : context->argument(2).toNumber();
- t = TimeClip(MakeDate(MakeDay(year, month, date), TimeWithinDay(t)));
- QScriptValueImpl r(t);
- self.setInternalValue(r);
- return r;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setUTCFullYear"));
-}
-
-QScriptValueImpl Date::method_setYear(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- Q_UNUSED(eng);
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- if (qIsNaN(t))
- t = 0;
- else
- t = LocalTime(t);
- qsreal year = context->argument(0).toNumber();
- qsreal r;
- if (qIsNaN(year)) {
- r = qSNaN();
- } else {
- if ((eng->toInteger(year) >= 0) && (eng->toInteger(year) <= 99))
- year += 1900;
- r = MakeDay(year, MonthFromTime(t), DateFromTime(t));
- r = UTC(MakeDate(r, TimeWithinDay(t)));
- r = TimeClip(r);
- }
- QScriptValueImpl v = QScriptValueImpl(r);
- self.setInternalValue(v);
- return v;
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.setYear"));
-}
-
-QScriptValueImpl Date::method_toUTCString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() == classInfo) {
- qsreal t = self.internalValue().toNumber();
- return QScriptValueImpl(eng, ToUTCString(t));
- }
- return throwThisObjectTypeError(
- context, QLatin1String("Date.prototype.toUTCString"));
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmadate_p.h b/src/script/qscriptecmadate_p.h
deleted file mode 100644
index 4d705a5..0000000
--- a/src/script/qscriptecmadate_p.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMADATE_P_H
-#define QSCRIPTECMADATE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptecmacore_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-class QDate;
-class QDateTime;
-
-namespace QScript { namespace Ecma {
-
-class Date: public Core
-{
-public:
- Date(QScriptEnginePrivate *engine);
- virtual ~Date();
-
- virtual void execute(QScriptContextPrivate *context);
-
- void newDate(QScriptValueImpl *result, double t);
- void newDate(QScriptValueImpl *result, const QDateTime &dt);
- void newDate(QScriptValueImpl *result, const QDate &d);
-
- QDateTime toDateTime(const QScriptValueImpl &date) const;
-
-protected:
- static QScriptValueImpl method_MakeTime(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_MakeDate(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_TimeClip(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_parse(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_UTC(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toDateString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toTimeString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLocaleString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLocaleDateString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLocaleTimeString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_valueOf(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getTime(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getYear(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getFullYear(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getUTCFullYear(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getMonth(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getUTCMonth(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getDate(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getUTCDate(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getDay(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getUTCDay(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getHours(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getUTCHours(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getMinutes(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getUTCMinutes(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getSeconds(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getUTCSeconds(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getMilliseconds(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getUTCMilliseconds(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_getTimezoneOffset(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setTime(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setMilliseconds(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setUTCMilliseconds(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setSeconds(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setUTCSeconds(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setMinutes(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setUTCMinutes(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setHours(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setUTCHours(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setDate(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setUTCDate(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setMonth(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setUTCMonth(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setYear(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setFullYear(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_setUTCFullYear(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toUTCString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-};
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptecmaerror.cpp b/src/script/qscriptecmaerror.cpp
deleted file mode 100644
index 0dde68c..0000000
--- a/src/script/qscriptecmaerror.cpp
+++ /dev/null
@@ -1,368 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmaerror_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QtDebug>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-static QString getMessage(QScriptContextPrivate *context)
-{
- if (context->argumentCount() > 0)
- return context->argument(0).toString();
- return QString();
-}
-
-static void setDebugInformation(QScriptValueImpl *error, QScriptContextPrivate *context)
-{
- Q_ASSERT(context->previous);
- context->previous->setDebugInformation(error);
-}
-
-static QScriptValueImpl method_EvalError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->isCalledAsConstructor())
- result = context->thisObject();
- eng->errorConstructor->newEvalError(&result, getMessage(context));
- setDebugInformation(&result, context);
- return result;
-}
-
-static QScriptValueImpl method_RangeError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->isCalledAsConstructor())
- result = context->thisObject();
- eng->errorConstructor->newRangeError(&result, getMessage(context));
- setDebugInformation(&result, context);
- return result;
-}
-
-static QScriptValueImpl method_ReferenceError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->isCalledAsConstructor())
- result = context->thisObject();
- eng->errorConstructor->newReferenceError(&result, getMessage(context));
- setDebugInformation(&result, context);
- return result;
-}
-
-static QScriptValueImpl method_SyntaxError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->isCalledAsConstructor())
- result = context->thisObject();
- eng->errorConstructor->newSyntaxError(&result, getMessage(context));
- setDebugInformation(&result, context);
- return result;
-}
-
-static QScriptValueImpl method_TypeError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->isCalledAsConstructor())
- result = context->thisObject();
- eng->errorConstructor->newTypeError(&result, getMessage(context));
- setDebugInformation(&result, context);
- return result;
-}
-
-static QScriptValueImpl method_UriError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->isCalledAsConstructor())
- result = context->thisObject();
- eng->errorConstructor->newURIError(&result, getMessage(context));
- setDebugInformation(&result, context);
- return result;
-}
-
-Error::Error(QScriptEnginePrivate *eng):
- Core(eng, QLatin1String("Error"), QScriptClassInfo::ErrorType)
-{
- eng->newFunction(&ctor, this);
- newErrorPrototype(&publicPrototype, QScriptValueImpl(), ctor, QLatin1String("Error"));
- addPrototypeFunction(QLatin1String("backtrace"), method_backtrace, 0);
- addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
-
- // native errors
-
- evalErrorCtor = eng->createFunction(method_EvalError, 3,
- classInfo(), QLatin1String("EvalError"));
- rangeErrorCtor = eng->createFunction(method_RangeError, 3,
- classInfo(), QLatin1String("RangeError"));
- referenceErrorCtor = eng->createFunction(method_ReferenceError, 3,
- classInfo(), QLatin1String("ReferenceError"));
- syntaxErrorCtor = eng->createFunction(method_SyntaxError, 3,
- classInfo(), QLatin1String("SyntaxError"));
- typeErrorCtor = eng->createFunction(method_TypeError, 3,
- classInfo(), QLatin1String("TypeError"));
- uriErrorCtor = eng->createFunction(method_UriError, 3,
- classInfo(), QLatin1String("URIError"));
-
- newErrorPrototype(&evalErrorPrototype, publicPrototype,
- evalErrorCtor, QLatin1String("EvalError"));
- newErrorPrototype(&rangeErrorPrototype, publicPrototype,
- rangeErrorCtor, QLatin1String("RangeError"));
- newErrorPrototype(&referenceErrorPrototype, publicPrototype,
- referenceErrorCtor, QLatin1String("ReferenceError"));
- newErrorPrototype(&syntaxErrorPrototype, publicPrototype,
- syntaxErrorCtor, QLatin1String("SyntaxError"));
- newErrorPrototype(&typeErrorPrototype, publicPrototype,
- typeErrorCtor, QLatin1String("TypeError"));
- newErrorPrototype(&uriErrorPrototype, publicPrototype,
- uriErrorCtor, QLatin1String("URIError"));
-}
-
-Error::~Error()
-{
-}
-
-void Error::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- QString message = QString();
-
- if (context->argumentCount() > 0)
- message = context->argument(0).toString();
-
- QScriptValueImpl result;
- newError(&result, publicPrototype, message);
-
- setDebugInformation(&result, context);
-
- context->setReturnValue(result);
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-void Error::mark(QScriptEnginePrivate *eng, int generation)
-{
- Core::mark(eng, generation);
-
- eng->markObject(evalErrorCtor, generation);
- eng->markObject(rangeErrorCtor, generation);
- eng->markObject(referenceErrorCtor, generation);
- eng->markObject(syntaxErrorCtor, generation);
- eng->markObject(typeErrorCtor, generation);
- eng->markObject(uriErrorCtor, generation);
-
- eng->markObject(evalErrorPrototype, generation);
- eng->markObject(rangeErrorPrototype, generation);
- eng->markObject(referenceErrorPrototype, generation);
- eng->markObject(syntaxErrorPrototype, generation);
- eng->markObject(typeErrorPrototype, generation);
- eng->markObject(uriErrorPrototype, generation);
-}
-
-void Error::newError(QScriptValueImpl *result, const QString &message)
-{
- newError(result, publicPrototype, message);
-}
-
-void Error::newEvalError(QScriptValueImpl *result, const QString &message)
-{
- newError(result, evalErrorPrototype, message);
-}
-
-void Error::newRangeError(QScriptValueImpl *result, const QString &message)
-{
- newError(result, rangeErrorPrototype, message);
-}
-
-void Error::newReferenceError(QScriptValueImpl *result, const QString &message)
-{
- newError(result, referenceErrorPrototype, message);
-}
-
-void Error::newSyntaxError(QScriptValueImpl *result, const QString &message)
-{
- newError(result, syntaxErrorPrototype, message);
-}
-
-void Error::newTypeError(QScriptValueImpl *result, const QString &message)
-{
- newError(result, typeErrorPrototype, message);
-}
-
-void Error::newURIError(QScriptValueImpl *result, const QString &message)
-{
- newError(result, uriErrorPrototype, message);
-}
-
-void Error::newError(QScriptValueImpl *result, const QScriptValueImpl &proto,
- const QString &message)
-{
- QScriptEnginePrivate *eng_p = engine();
-
- if (!result->isValid())
- eng_p->newObject(result, proto, classInfo());
- else
- result->setClassInfo(classInfo());
- result->setProperty(QLatin1String("message"), QScriptValueImpl(eng_p, message));
-}
-
-void Error::newErrorPrototype(QScriptValueImpl *result, const QScriptValueImpl &proto,
- QScriptValueImpl &ztor, const QString &name)
-{
- newError(result, proto);
- result->setProperty(QLatin1String("name"), QScriptValueImpl(engine(), name));
- result->setProperty(QLatin1String("constructor"), ztor,
- QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration);
- ztor.setProperty(QLatin1String("prototype"), *result,
- QScriptValue::Undeletable
- | QScriptValue::ReadOnly
- | QScriptValue::SkipInEnumeration);
-}
-
-bool Error::isEvalError(const QScriptValueImpl &value) const
-{
- return value.instanceOf(evalErrorPrototype);
-}
-
-bool Error::isRangeError(const QScriptValueImpl &value) const
-{
- return value.instanceOf(rangeErrorPrototype);
-}
-
-bool Error::isReferenceError(const QScriptValueImpl &value) const
-{
- return value.instanceOf(referenceErrorPrototype);
-}
-
-bool Error::isSyntaxError(const QScriptValueImpl &value) const
-{
- return value.instanceOf(syntaxErrorPrototype);
-}
-
-bool Error::isTypeError(const QScriptValueImpl &value) const
-{
- return value.instanceOf(typeErrorPrototype);
-}
-
-bool Error::isURIError(const QScriptValueImpl &value) const
-{
- return value.instanceOf(uriErrorPrototype);
-}
-
-QStringList Error::backtrace(const QScriptValueImpl &error)
-{
- QStringList result;
- QScriptValueImpl stack = error.property(QLatin1String("stack"));
- int frameCount = stack.property(QLatin1String("length")).toInt32();
- for (int i = 0; i < frameCount; ++i) {
- QScriptValueImpl o = stack.property(i);
- QScriptValueImpl frame = o.property(QLatin1String("frame"));
- QString s;
- QString functionName = o.property(QLatin1String("functionName")).toString();
- if (functionName.isEmpty()) {
- if (i == frameCount-1)
- s += QLatin1String("<global>");
- else
- s += QLatin1String("<anonymous>");
- } else {
- s += functionName;
- }
- s += QLatin1Char('(');
- QScriptValueImpl arguments = frame.property(QLatin1String("arguments"));
- if (arguments.isObject()) {
- int argCount = arguments.property(QLatin1String("length")).toInt32();
- for (int j = 0; j < argCount; ++j) {
- if (j > 0)
- s += QLatin1Char(',');
- s += arguments.property(j).toString();
- }
- }
- s += QLatin1String(")@") + o.property(QLatin1String("fileName")).toString()
- + QLatin1Char(':') + o.property(QLatin1String("lineNumber")).toString();
- result.append(s);
- }
- return result;
-}
-
-QScriptValueImpl Error::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl name = context->thisObject().property(QLatin1String("name"),
- QScriptValue::ResolvePrototype);
- QScriptValueImpl message = context->thisObject().property(QLatin1String("message"),
- QScriptValue::ResolvePrototype);
- QString result = QLatin1String("");
- if (name.isValid())
- result = name.toString();
- if (message.isValid()) {
- QString str = message.toString();
- if (!str.isEmpty()) {
- if (!result.isEmpty())
- result += QLatin1String(": ");
- result += str;
- }
- }
- return (QScriptValueImpl(eng, result));
-}
-
-QScriptValueImpl Error::method_backtrace(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl self = context->thisObject();
- return eng->arrayFromStringList(backtrace(self));
-}
-
-} } // namespace QSA::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmaerror_p.h b/src/script/qscriptecmaerror_p.h
deleted file mode 100644
index dddcb3e..0000000
--- a/src/script/qscriptecmaerror_p.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMAERROR_P_H
-#define QSCRIPTECMAERROR_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptecmacore_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class Error: public Core
-{
-public:
- Error(QScriptEnginePrivate *engine);
- virtual ~Error();
-
- virtual void execute(QScriptContextPrivate *context);
-
- virtual void mark(QScriptEnginePrivate *eng, int generation);
-
- void newError(QScriptValueImpl *result, const QString &message = QString());
- void newEvalError(QScriptValueImpl *result, const QString &message = QString());
- void newRangeError(QScriptValueImpl *result, const QString &message = QString());
- void newReferenceError(QScriptValueImpl *result, const QString &message = QString());
- void newSyntaxError(QScriptValueImpl *result, const QString &message = QString());
- void newTypeError(QScriptValueImpl *result, const QString &message = QString());
- void newURIError(QScriptValueImpl *result, const QString &message = QString());
-
- bool isEvalError(const QScriptValueImpl &value) const;
- bool isRangeError(const QScriptValueImpl &value) const;
- bool isReferenceError(const QScriptValueImpl &value) const;
- bool isSyntaxError(const QScriptValueImpl &value) const;
- bool isTypeError(const QScriptValueImpl &value) const;
- bool isURIError(const QScriptValueImpl &value) const;
-
- static QStringList backtrace(const QScriptValueImpl &error);
-
- QScriptValueImpl evalErrorCtor;
- QScriptValueImpl rangeErrorCtor;
- QScriptValueImpl referenceErrorCtor;
- QScriptValueImpl syntaxErrorCtor;
- QScriptValueImpl typeErrorCtor;
- QScriptValueImpl uriErrorCtor;
-
- QScriptValueImpl evalErrorPrototype;
- QScriptValueImpl rangeErrorPrototype;
- QScriptValueImpl referenceErrorPrototype;
- QScriptValueImpl syntaxErrorPrototype;
- QScriptValueImpl typeErrorPrototype;
- QScriptValueImpl uriErrorPrototype;
-
-protected:
- static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
- static QScriptValueImpl method_backtrace(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
-
-private:
- void newError(QScriptValueImpl *result, const QScriptValueImpl &proto,
- const QString &message = QString());
- void newErrorPrototype(QScriptValueImpl *result, const QScriptValueImpl &proto,
- QScriptValueImpl &ztor, const QString &name);
-};
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTECMAERROR_P_H
diff --git a/src/script/qscriptecmafunction.cpp b/src/script/qscriptecmafunction.cpp
deleted file mode 100644
index a1e5b58..0000000
--- a/src/script/qscriptecmafunction.cpp
+++ /dev/null
@@ -1,459 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmafunction_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QtDebug>
-
-#ifndef QT_NO_QOBJECT
-# include "qscriptextqobject_p.h"
-# include <QtCore/QMetaMethod>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class FunctionClassData: public QScriptClassData
-{
- QScriptClassInfo *m_classInfo;
-
-public:
- FunctionClassData(QScriptClassInfo *classInfo);
- virtual ~FunctionClassData();
-
- inline QScriptClassInfo *classInfo() const
- { return m_classInfo; }
-
- virtual bool resolve(const QScriptValueImpl &object,
- QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode access);
- virtual bool get(const QScriptValueImpl &obj, const Member &m,
- QScriptValueImpl *out_value);
- virtual bool put(QScriptValueImpl *object, const QScript::Member &member,
- const QScriptValueImpl &value);
- virtual void mark(const QScriptValueImpl &object, int generation);
-};
-
-FunctionClassData::FunctionClassData(QScriptClassInfo *classInfo)
- : m_classInfo(classInfo)
-{
-}
-
-FunctionClassData::~FunctionClassData()
-{
-}
-
-bool FunctionClassData::resolve(const QScriptValueImpl &object,
- QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode /*access*/)
-{
- if (object.classInfo() != classInfo())
- return false;
-
- QScriptEnginePrivate *eng = object.engine();
-
- if ((nameId == eng->idTable()->id_length)
- || (nameId == eng->idTable()->id_arguments)) {
- member->native(nameId, /*id=*/ 0,
- QScriptValue::Undeletable
- | QScriptValue::ReadOnly
- | QScriptValue::SkipInEnumeration);
- *base = object;
- return true;
- }
-
- return false;
-}
-
-bool FunctionClassData::get(const QScriptValueImpl &object, const Member &member,
- QScriptValueImpl *result)
-{
- if (object.classInfo() != classInfo())
- return false;
-
- QScriptEnginePrivate *eng = object.engine();
- if (! member.isNativeProperty())
- return false;
-
- if (member.nameId() == eng->idTable()->id_length) {
- *result = QScriptValueImpl(object.toFunction()->length);
- return true;
- } else if (member.nameId() == eng->idTable()->id_arguments) {
- *result = eng->nullValue();
- return true;
- }
-
- return false;
-}
-
-bool FunctionClassData::put(QScriptValueImpl *, const QScript::Member &,
- const QScriptValueImpl &)
-{
- return false;
-}
-
-void FunctionClassData::mark(const QScriptValueImpl &object, int generation)
-{
- if (object.classInfo() != classInfo())
- return;
- QScriptFunction *fun = object.toFunction();
- QScriptEnginePrivate *eng = object.engine();
- fun->mark(eng, generation);
-}
-
-Function::Function(QScriptEnginePrivate *eng, QScriptClassInfo *classInfo):
- Core(eng, classInfo)
-{
- publicPrototype = eng->createFunction(method_void, 0, classInfo); // public prototype
-}
-
-Function::~Function()
-{
-}
-
-void Function::initialize()
-{
- QScriptEnginePrivate *eng = engine();
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("toString"), method_toString, 1);
- addPrototypeFunction(QLatin1String("apply"), method_apply, 2);
- addPrototypeFunction(QLatin1String("call"), method_call, 1);
- addPrototypeFunction(QLatin1String("connect"), method_connect, 1);
- addPrototypeFunction(QLatin1String("disconnect"), method_disconnect, 1);
-
- classInfo()->setData(new FunctionClassData(classInfo()));
-}
-
-void Function::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- int lineNumber = context->currentLine;
- QString contents = buildFunction(context);
- engine()->evaluate(context, contents, lineNumber);
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-QString Function::buildFunction(QScriptContextPrivate *context)
-{
- int argc = context->argumentCount();
-
- QString code;
- code += QLatin1String("function(");
-
- // the formals
- for (int i = 0; i < argc - 1; ++i) {
- if (i != 0)
- code += QLatin1Char(',');
-
- code += context->argument(i).toString();
- }
-
- code += QLatin1String("){");
-
- // the function body
- if (argc != 0)
- code += context->argument(argc - 1).toString();
-
- code += QLatin1String("\n}");
-
- return code;
-}
-
-void Function::newFunction(QScriptValueImpl *result, QScriptFunction *foo)
-{
- engine()->newFunction(result, foo);
-}
-
-QScriptValueImpl Function::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl self = context->thisObject();
- if (QScriptFunction *foo = self.toFunction()) {
- QString code = foo->toString(context);
- return QScriptValueImpl(eng, code);
- }
-
- return throwThisObjectTypeError(
- context, QLatin1String("Function.prototype.toString"));
-}
-
-QScriptValueImpl Function::method_call(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- if (! context->thisObject().isFunction()) {
- return throwThisObjectTypeError(
- context, QLatin1String("Function.prototype.call"));
- }
-
- QScriptValueImpl thisObject = eng->toObject(context->argument(0));
- if (! (thisObject.isValid () && thisObject.isObject()))
- thisObject = eng->globalObject();
-
- QScriptValueImplList args;
- for (int i = 1; i < context->argumentCount(); ++i)
- args << context->argument(i);
-
- return context->thisObject().call(thisObject, args);
-}
-
-QScriptValueImpl Function::method_apply(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- if (! context->thisObject().isFunction()) {
- return throwThisObjectTypeError(
- context, QLatin1String("Function.prototype.apply"));
- }
-
- QScriptValueImpl thisObject = eng->toObject(context->argument(0));
- if (! (thisObject.isValid () && thisObject.isObject()))
- thisObject = eng->globalObject();
-
- QScriptValueImplList args;
- QScriptValueImpl undefined = eng->undefinedValue();
-
- QScriptValueImpl arg = context->argument(1);
-
- if (Ecma::Array::Instance *arr = eng->arrayConstructor->get(arg)) {
- QScript::Array actuals = arr->value;
-
- for (quint32 i = 0; i < actuals.count(); ++i) {
- QScriptValueImpl a = actuals.at(i);
- if (! a.isValid())
- args << undefined;
- else
- args << a;
- }
- } else if (arg.classInfo() == eng->m_class_arguments) {
- QScript::ArgumentsObjectData *arguments;
- arguments = static_cast<QScript::ArgumentsObjectData*> (arg.objectData());
- QScriptObject *activation = arguments->activation.objectValue();
- for (uint i = 0; i < arguments->length; ++i)
- args << activation->m_values[i];
- } else if (!(arg.isUndefined() || arg.isNull())) {
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("Function.prototype.apply: second argument is not an array"));
- }
-
- return context->thisObject().call(thisObject, args);
-}
-
-QScriptValueImpl Function::method_void(QScriptContextPrivate *, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- return eng->undefinedValue();
-}
-
-QScriptValueImpl Function::method_disconnect(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
-#ifndef QT_NO_QOBJECT
- if (context->argumentCount() == 0) {
- return context->throwError(
- QLatin1String("Function.prototype.disconnect: no arguments given"));
- }
-
- QScriptValueImpl self = context->thisObject();
- QScriptFunction *fun = self.toFunction();
- if ((fun == 0) || (fun->type() != QScriptFunction::Qt)) {
- return context->throwError(
- QScriptContext::TypeError,
- QLatin1String("Function.prototype.disconnect: this object is not a signal"));
- }
-
- QtFunction *qtSignal = static_cast<QtFunction*>(fun);
-
- const QMetaObject *meta = qtSignal->metaObject();
- if (!meta) {
- return context->throwError(
- QScriptContext::TypeError,
- QString::fromLatin1("Function.prototype.disconnect: cannot disconnect from deleted QObject"));
- }
-
- QMetaMethod sig = meta->method(qtSignal->initialIndex());
- if (sig.methodType() != QMetaMethod::Signal) {
- return context->throwError(QScriptContext::TypeError,
- QString::fromLatin1("Function.prototype.disconnect: %0::%1 is not a signal")
- .arg(QLatin1String(qtSignal->metaObject()->className()))
- .arg(QLatin1String(sig.signature())));
- }
-
- QScriptValueImpl receiver;
- QScriptValueImpl slot;
- QScriptValueImpl arg0 = context->argument(0);
- if (context->argumentCount() < 2) {
- receiver = QScriptValueImpl();
- slot = arg0;
- } else {
- receiver = arg0;
- QScriptValueImpl arg1 = context->argument(1);
- if (arg1.isFunction())
- slot = arg1;
- else
- slot = receiver.property(arg1.toString(), QScriptValue::ResolvePrototype);
- }
-
- if (!slot.isFunction()) {
- return context->throwError(
- QScriptContext::TypeError,
- QLatin1String("Function.prototype.disconnect: target is not a function"));
- }
-
- bool ok = eng->scriptDisconnect(self, receiver, slot);
- if (!ok) {
- return context->throwError(
- QString::fromLatin1("Function.prototype.disconnect: failed to disconnect from %0::%1")
- .arg(QLatin1String(qtSignal->metaObject()->className()))
- .arg(QLatin1String(sig.signature())));
- }
- return eng->undefinedValue();
-#else
- Q_UNUSED(eng);
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("Function.prototype.disconnect"));
-#endif // QT_NO_QOBJECT
-}
-
-QScriptValueImpl Function::method_connect(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- Q_UNUSED(classInfo);
-
-#ifndef QT_NO_QOBJECT
- if (context->argumentCount() == 0) {
- return context->throwError(
- QLatin1String("Function.prototype.connect: no arguments given"));
- }
-
- QScriptValueImpl self = context->thisObject();
- QScriptFunction *fun = self.toFunction();
- if ((fun == 0) || (fun->type() != QScriptFunction::Qt)) {
- return context->throwError(
- QScriptContext::TypeError,
- QLatin1String("Function.prototype.connect: this object is not a signal"));
- }
-
- QtFunction *qtSignal = static_cast<QtFunction*>(fun);
-
- const QMetaObject *meta = qtSignal->metaObject();
- if (!meta) {
- return context->throwError(
- QScriptContext::TypeError,
- QString::fromLatin1("Function.prototype.connect: cannot connect to deleted QObject"));
- }
-
- QMetaMethod sig = meta->method(qtSignal->initialIndex());
- if (sig.methodType() != QMetaMethod::Signal) {
- return context->throwError(QScriptContext::TypeError,
- QString::fromLatin1("Function.prototype.connect: %0::%1 is not a signal")
- .arg(QLatin1String(qtSignal->metaObject()->className()))
- .arg(QLatin1String(sig.signature())));
- }
-
- {
- QList<int> overloads = qtSignal->overloadedIndexes();
- if (!overloads.isEmpty()) {
- overloads.append(qtSignal->initialIndex());
- QByteArray signature = sig.signature();
- QString message = QString::fromLatin1("Function.prototype.connect: ambiguous connect to %0::%1(); candidates are\n")
- .arg(QLatin1String(qtSignal->metaObject()->className()))
- .arg(QLatin1String(signature.left(signature.indexOf('('))));
- for (int i = 0; i < overloads.size(); ++i) {
- QMetaMethod mtd = meta->method(overloads.at(i));
- message.append(QString::fromLatin1(" %0\n").arg(QString::fromLatin1(mtd.signature())));
- }
- message.append(QString::fromLatin1("Use e.g. object['%0'].connect() to connect to a particular overload")
- .arg(QLatin1String(signature)));
- return context->throwError(message);
- }
- }
-
- QScriptValueImpl receiver;
- QScriptValueImpl slot;
- QScriptValueImpl arg0 = context->argument(0);
- if (context->argumentCount() < 2) {
- receiver = QScriptValueImpl();
- slot = arg0;
- } else {
- receiver = arg0;
- QScriptValueImpl arg1 = context->argument(1);
- if (arg1.isFunction())
- slot = arg1;
- else
- slot = receiver.property(arg1.toString(), QScriptValue::ResolvePrototype);
- }
-
- if (!slot.isFunction()) {
- return context->throwError(
- QScriptContext::TypeError,
- QLatin1String("Function.prototype.connect: target is not a function"));
- }
-
- bool ok = eng->scriptConnect(self, receiver, slot);
- if (!ok) {
- return context->throwError(
- QString::fromLatin1("Function.prototype.connect: failed to connect to %0::%1")
- .arg(QLatin1String(qtSignal->metaObject()->className()))
- .arg(QLatin1String(sig.signature())));
- }
- return eng->undefinedValue();
-#else
- Q_UNUSED(eng);
- Q_UNUSED(classInfo);
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("Function.prototype.connect"));
-#endif // QT_NO_QOBJECT
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmafunction_p.h b/src/script/qscriptecmafunction_p.h
deleted file mode 100644
index 23b56f9..0000000
--- a/src/script/qscriptecmafunction_p.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMAFUNCTION_P_H
-#define QSCRIPTECMAFUNCTION_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptecmacore_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class Function: public Core
-{
-public:
- Function(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo);
- virtual ~Function();
-
- void initialize();
-
- virtual void execute(QScriptContextPrivate *context);
-
- void newFunction(QScriptValueImpl *result, QScriptFunction *foo);
-
-protected:
- QString buildFunction(QScriptContextPrivate *context);
-
- static QScriptValueImpl method_toString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_apply(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_call(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_void(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_disconnect(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_connect(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-};
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptecmaglobal.cpp b/src/script/qscriptecmaglobal.cpp
deleted file mode 100644
index b5cf675..0000000
--- a/src/script/qscriptecmaglobal.cpp
+++ /dev/null
@@ -1,572 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// for strtoll
-#include <qplatformdefs.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptecmaglobal_p.h"
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QVarLengthArray>
-#include <QtCore/qnumeric.h>
-
-QT_BEGIN_NAMESPACE
-
-extern double qstrtod(const char *s00, char const **se, bool *ok);
-
-namespace QScript {
-
-extern qsreal integerFromString(const QString &str, int radix);
-
-static inline char toHex(char c)
-{
- static const char hexnumbers[] = "0123456789ABCDEF";
- return hexnumbers[c & 0xf];
-}
-
-static int fromHex(char c)
-{
- if ((c >= '0') && (c <= '9'))
- return c - '0';
- if ((c >= 'A') && (c <= 'F'))
- return c - 'A' + 10;
- if ((c >= 'a') && (c <= 'f'))
- return c - 'a' + 10;
- return -1;
-}
-
-static QByteArray escape(const QString &input)
-{
- QVarLengthArray<char> output;
- output.reserve(input.size() * 3);
- const int length = input.length();
- for (int i = 0; i < length; ++i) {
- ushort uc = input.at(i).unicode();
- if (uc < 0x100) {
- if ( (uc > 0x60 && uc < 0x7B)
- || (uc > 0x3F && uc < 0x5B)
- || (uc > 0x2C && uc < 0x3A)
- || (uc == 0x2A)
- || (uc == 0x2B)
- || (uc == 0x5F)) {
- output.append(char(uc));
- } else {
- output.append('%');
- output.append(toHex(uc >> 4));
- output.append(toHex(uc));
- }
- } else {
- output.append('%');
- output.append('u');
- output.append(toHex(uc >> 12));
- output.append(toHex(uc >> 8));
- output.append(toHex(uc >> 4));
- output.append(toHex(uc));
- }
- }
- return QByteArray(output.constData(), output.size());
-}
-
-static QString unescape(const QByteArray &input)
-{
- QString result;
- int i = 0;
- const int length = input.length();
- while (i < length) {
- char c = input.at(i++);
- if ((c == '%') && (i + 1 < length)) {
- char a = input.at(i);
- if ((a == 'u') && (i + 4 < length)) {
- int d3 = fromHex(input.at(i+1));
- int d2 = fromHex(input.at(i+2));
- int d1 = fromHex(input.at(i+3));
- int d0 = fromHex(input.at(i+4));
- if ((d3 != -1) && (d2 != -1) && (d1 != -1) && (d0 != -1)) {
- ushort uc = ushort((d3 << 12) | (d2 << 8) | (d1 << 4) | d0);
- result.append(QChar(uc));
- i += 5;
- } else {
- result.append(QLatin1Char(c));
- }
- } else {
- int d1 = fromHex(a);
- int d0 = fromHex(input.at(i+1));
- if ((d1 != -1) && (d0 != -1)) {
- c = (d1 << 4) | d0;
- i += 2;
- }
- result.append(QLatin1Char(c));
- }
- } else {
- result.append(QLatin1Char(c));
- }
- }
- return result;
-}
-
-static const char uriReserved[] = ";/?:@&=+$,";
-static const char uriUnescaped[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";
-
-static QString encode(const QString &input, const QString &unescapedSet, bool *ok)
-{
- QString output;
- const int length = input.length();
- int i = 0;
- while (i < length) {
- const QChar c = input.at(i);
- if (!unescapedSet.contains(c)) {
- ushort uc = c.unicode();
- if ((uc >= 0xDC00) && (uc <= 0xDFFF)) {
- // URIError
- break;
- }
- if (!((uc < 0xD800) || (uc > 0xDBFF))) {
- ++i;
- if (i == length) {
- // URIError
- break;
- }
- const ushort uc2 = input.at(i).unicode();
- if ((uc < 0xDC00) || (uc > 0xDFFF)) {
- // URIError
- break;
- }
- uc = ((uc - 0xD800) * 0x400) + (uc2 - 0xDC00) + 0x10000;
- }
- QString tmp(1, QChar(uc));
- QByteArray octets = tmp.toUtf8();
- for (int j = 0; j < octets.length(); ++j) {
- output.append(QLatin1Char('%'));
- output.append(QLatin1Char(toHex(octets.at(j) >> 4)));
- output.append(QLatin1Char(toHex(octets.at(j))));
- }
- } else {
- output.append(c);
- }
- ++i;
- }
- *ok = (i == length);
- return output;
-}
-
-static QString decode(const QString &input, const QString &reservedSet, bool *ok)
-{
- QString output;
- const int length = input.length();
- int i = 0;
- const QChar percent = QLatin1Char('%');
- while (i < length) {
- const QChar c = input.at(i);
- if (c == percent) {
- int start = i;
- if (i + 2 >= length) {
- // URIError
- break;
- }
- int d1 = fromHex(input.at(i+1).toLatin1());
- int d0 = fromHex(input.at(i+2).toLatin1());
- if ((d1 == -1) || (d0 == -1)) {
- // URIError
- break;
- }
- int b = (d1 << 4) | d0;
- i += 2;
- if (b & 0x80) {
- int n = -1;
- while ((b << ++n) & 0x80) ;
- if ((n == 1) || (n > 4)) {
- // URIError
- break;
- }
- QByteArray octets;
- octets.append(b);
- if (i + (3 * (n - 1)) >= length) {
- // URIError
- break;
- }
- for (int j = 1; j < n; ++j) {
- ++i;
- if (input.at(i) != percent) {
- // URIError
- break;
- }
- d1 = fromHex(input.at(i+1).toLatin1());
- d0 = fromHex(input.at(i+2).toLatin1());
- if ((d1 == -1) || (d0 == -1)) {
- // URIError
- break;
- }
- b = (d1 << 4) | d0;
- if ((b & 0xC0) != 0x80) {
- // URIError
- break;
- }
- i += 2;
- octets.append(b);
- }
- QString tmp = QString::fromUtf8(octets);
- Q_ASSERT(tmp.length() == 1);
- uint v = tmp.at(0).unicode(); // ### need 32-bit value
- if (v < 0x10000) {
- QChar z = QChar(ushort(v));
- if (!reservedSet.contains(z)) {
- output.append(z);
- } else {
- output.append(input.mid(start, i - start + 1));
- }
- } else {
- if (v > 0x10FFFF) {
- // URIError
- break;
- }
- ushort l = ushort(((v - 0x10000) & 0x3FF) + 0xDC00);
- ushort h = ushort((((v - 0x10000) >> 10) & 0x3FF) + 0xD800);
- output.append(QChar(l));
- output.append(QChar(h));
- }
- } else {
- output.append(ushort(b));
- }
- } else {
- output.append(c);
- }
- ++i;
- }
- *ok = (i == length);
- return output;
-}
-
-class PrintFunction : public QScriptFunction
-{
-public:
- PrintFunction() {}
-
- virtual ~PrintFunction() {}
-
- virtual void execute(QScriptContextPrivate *context)
- {
- QScriptEnginePrivate *eng = context->engine();
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng->notifyFunctionEntry(context);
-#endif
- QString result;
- for (int i = 0; i < context->argumentCount(); ++i) {
- if (i != 0)
- result.append(QLatin1Char(' '));
-
- QString s = context->argument(i).toString();
- if (context->state() == QScriptContext::ExceptionState)
- break;
- result.append(s);
- }
-
- if (context->state() != QScriptContext::ExceptionState) {
- QTextStream qout(stdout, QIODevice::WriteOnly);
- qout << result << endl;
- context->setReturnValue(eng->undefinedValue());
- }
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng->notifyFunctionExit(context);
-#endif
- }
-
- QString functionName() const
- {
- return QLatin1String("print");
- }
-};
-
-} // anonumous
-
-namespace QScript { namespace Ecma {
-
-Global::Global(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo)
- : m_engine(engine), m_classInfo(classInfo)
-{
-}
-
-Global::~Global()
-{
-}
-
-void Global::construct(QScriptValueImpl *object, QScriptEnginePrivate *eng)
-{
- QScriptClassInfo *classInfo = eng->registerClass(QLatin1String("global"),
- QScriptClassInfo::ActivationType);
-
- // create with prototype null, since Object.prototype doesn't exist at this point
- eng->newObject(object, eng->nullValue(), classInfo);
-
- Global *instance = new Global(eng, classInfo);
- object->setObjectData(instance);
-}
-
-void Global::initialize(QScriptValueImpl *object, QScriptEnginePrivate *eng)
-{
- // set the real prototype
- object->setPrototype(eng->objectConstructor->publicPrototype);
-
- const QScriptValue::PropertyFlags flags = QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration;
-
- object->setProperty(QLatin1String("NaN"), QScriptValueImpl(qSNaN()), flags);
- object->setProperty(QLatin1String("Infinity"), QScriptValueImpl(qInf()), flags);
- object->setProperty(QLatin1String("undefined"), eng->undefinedValue(), flags);
-
- object->setProperty(QLatin1String("print"),
- eng->createFunction(new PrintFunction()), flags);
- addFunction(*object, QLatin1String("parseInt"), method_parseInt, 2, flags);
- addFunction(*object, QLatin1String("parseFloat"), method_parseFloat, 1, flags);
- addFunction(*object, QLatin1String("isNaN"), method_isNaN, 1, flags);
- addFunction(*object, QLatin1String("isFinite"), method_isFinite, 1, flags);
- addFunction(*object, QLatin1String("decodeURI"), method_decodeURI, 1, flags);
- addFunction(*object, QLatin1String("decodeURIComponent"), method_decodeURIComponent, 1, flags);
- addFunction(*object, QLatin1String("encodeURI"), method_encodeURI, 1, flags);
- addFunction(*object, QLatin1String("encodeURIComponent"), method_encodeURIComponent, 1, flags);
- addFunction(*object, QLatin1String("escape"), method_escape, 1, flags);
- addFunction(*object, QLatin1String("unescape"), method_unescape, 1, flags);
- addFunction(*object, QLatin1String("version"), method_version, 0, flags);
- addFunction(*object, QLatin1String("gc"), method_gc, 0, flags);
-}
-
-QScriptValueImpl Global::method_parseInt(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- if (context->argumentCount() == 0)
- return qSNaN();
-
- qsreal radix = 0;
- if (context->argumentCount() > 1) {
- radix = context->argument(1).toInteger();
- if (qIsNaN(radix) || (radix && (radix < 2 || radix > 36))) {
- return qSNaN();
- }
- }
-
- return QScript::integerFromString(context->argument(0).toString(), static_cast<int>(radix));
-}
-
-QScriptValueImpl Global::method_parseFloat(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- if (context->argumentCount() == 0)
- return QScriptValueImpl(qSNaN());
- QString str = context->argument(0).toString().trimmed();
- QByteArray latin1 = str.toLatin1();
- const char *data = latin1.constData();
- const char *eptr = 0;
- qsreal result = qstrtod(data, &eptr, 0);
- if (eptr == data) {
- if (str == QLatin1String("Infinity"))
- result = +qInf();
- else if (str == QLatin1String("+Infinity"))
- result = +qInf();
- else if (str == QLatin1String("-Infinity"))
- result = -qInf();
- else
- result = qSNaN();
- }
- return result;
-}
-
-QScriptValueImpl Global::method_isNaN(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = qSNaN();
- if (context->argumentCount() > 0)
- v = context->argument(0).toNumber();
- return (QScriptValueImpl(qIsNaN(v)));
-}
-
-QScriptValueImpl Global::method_isFinite(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = qInf();
- if (context->argumentCount() > 0)
- v = context->argument(0).toNumber();
- return (QScriptValueImpl(qIsFinite(v)));
-}
-
-QScriptValueImpl Global::method_decodeURI(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QScriptValueImpl result;
-
- if (context->argumentCount() > 0) {
- QString str = context->argument(0).toString();
- bool ok;
- QString out = decode(str, QString::fromUtf8(uriReserved) + QString::fromUtf8("#"), &ok);
- if (ok)
- return QScriptValueImpl(eng, out);
- else
- return context->throwError(QScriptContext::URIError,
- QLatin1String("malformed URI sequence"));
- }
-
- return eng->undefinedValue();
-}
-
-QScriptValueImpl Global::method_decodeURIComponent(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->argumentCount() > 0) {
- QString str = context->argument(0).toString();
- bool ok;
- QString out = decode(str, QString::fromUtf8(""), &ok);
- if (ok)
- result = QScriptValueImpl(eng, out);
- else
- result = context->throwError(QScriptContext::URIError,
- QLatin1String("malformed URI sequence"));
- } else {
- result = eng->undefinedValue();
- }
- return result;
-}
-
-QScriptValueImpl Global::method_encodeURI(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->argumentCount() > 0) {
- QString str = context->argument(0).toString();
- bool ok;
- QString out = encode(str,
- QLatin1String(uriReserved)
- + QLatin1String(uriUnescaped)
- + QString::fromUtf8("#"),
- &ok);
- if (ok)
- result = QScriptValueImpl(eng, out);
- else
- result = context->throwError(QScriptContext::URIError,
- QLatin1String("malformed URI sequence"));
- } else {
- result = eng->undefinedValue();
- }
- return result;
-}
-
-QScriptValueImpl Global::method_encodeURIComponent(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QScriptValueImpl result;
- if (context->argumentCount() > 0) {
- QString str = context->argument(0).toString();
- bool ok;
- QString out = encode(str, QLatin1String(uriUnescaped), &ok);
- if (ok)
- result = QScriptValueImpl(eng, out);
- else
- result = context->throwError(QScriptContext::URIError,
- QLatin1String("malformed URI sequence"));
- } else {
- result = eng->undefinedValue();
- }
- return result;
-}
-
-QScriptValueImpl Global::method_escape(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- if (context->argumentCount() > 0) {
- QString str = context->argument(0).toString();
- return QScriptValueImpl(eng, QLatin1String(escape(str)));
- }
- return QScriptValueImpl(eng, QLatin1String("undefined"));
-}
-
-QScriptValueImpl Global::method_unescape(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- if (context->argumentCount() > 0) {
- QByteArray data = context->argument(0).toString().toLatin1();
- return QScriptValueImpl(eng, unescape(data));
- }
- return QScriptValueImpl(eng, QLatin1String("undefined"));
-}
-
-QScriptValueImpl Global::method_version(QScriptContextPrivate *,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- return (QScriptValueImpl(1));
-}
-
-QScriptValueImpl Global::method_gc(QScriptContextPrivate *,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- eng->gc();
- return QScriptValueImpl(eng->objectAllocator.freeBlocks());
-}
-
-void Global::addFunction(QScriptValueImpl &object, const QString &name,
- QScriptInternalFunctionSignature fun, int length,
- const QScriptValue::PropertyFlags flags)
-{
- QScriptEnginePrivate *eng_p = object.engine();
- QScriptValueImpl val = eng_p->createFunction(fun, length, object.classInfo(), name);
- object.setProperty(name, val, flags);
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmaglobal_p.h b/src/script/qscriptecmaglobal_p.h
deleted file mode 100644
index 3df1c0a..0000000
--- a/src/script/qscriptecmaglobal_p.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMAGLOBAL_P_H
-#define QSCRIPTECMAGLOBAL_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptobjectdata_p.h"
-#include "qscriptfunction_p.h"
-#include "qscriptvalue.h"
-
-QT_BEGIN_NAMESPACE
-
-class QScriptEnginePrivate;
-class QScriptContextPrivate;
-class QScriptClassInfo;
-class QScriptValueImpl;
-
-#ifndef QT_NO_SCRIPT
-
-namespace QScript { namespace Ecma {
-
-class Global: public QScriptObjectData
-{
-protected:
- Global(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo);
-
-public:
- virtual ~Global();
-
- inline QScriptEnginePrivate *engine() const;
-
- static void construct(QScriptValueImpl *object, QScriptEnginePrivate *eng);
- static void initialize(QScriptValueImpl *object, QScriptEnginePrivate *eng);
-
-protected:
- static QScriptValueImpl method_parseInt(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_parseFloat(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_isNaN(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_isFinite(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_decodeURI(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_decodeURIComponent(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_encodeURI(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_encodeURIComponent(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_escape(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_unescape(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_version(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_gc(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-
-private:
- static void addFunction(QScriptValueImpl &object, const QString &name,
- QScriptInternalFunctionSignature fun, int length,
- const QScriptValue::PropertyFlags flags);
-
- QScriptEnginePrivate *m_engine;
- QScriptClassInfo *m_classInfo;
-};
-
-inline QScriptEnginePrivate *Global::engine() const
-{ return m_engine; }
-
-
-} } // namespace QScript::Ecma
-
-#endif // QT_NO_SCRIPT
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptecmamath.cpp b/src/script/qscriptecmamath.cpp
deleted file mode 100644
index e0fcf0a..0000000
--- a/src/script/qscriptecmamath.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmamath_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QtDebug>
-#include <QtCore/qnumeric.h>
-#include <QtCore/QSysInfo>
-#include <math.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-static const qsreal qt_PI = 2.0 * ::asin(1.0);
-
-Math::Math(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo):
- m_engine(engine),
- m_classInfo(classInfo)
-{
-}
-
-Math::~Math()
-{
-}
-
-void Math::construct(QScriptValueImpl *object, QScriptEnginePrivate *eng)
-{
- QScriptClassInfo *classInfo = eng->registerClass(QLatin1String("Math"));
-
- Math *instance = new Math(eng, classInfo);
- eng->newObject(object, classInfo);
- object->setObjectData(instance);
-
- QScriptValue::PropertyFlags flags = QScriptValue::Undeletable
- | QScriptValue::ReadOnly
- | QScriptValue::SkipInEnumeration;
-
- object->setProperty(QLatin1String("E"),
- QScriptValueImpl(::exp(1.0)), flags);
- object->setProperty(QLatin1String("LN2"),
- QScriptValueImpl(::log(2.0)), flags);
- object->setProperty(QLatin1String("LN10"),
- QScriptValueImpl(::log(10.0)), flags);
- object->setProperty(QLatin1String("LOG2E"),
- QScriptValueImpl(1.0/::log(2.0)), flags);
- object->setProperty(QLatin1String("LOG10E"),
- QScriptValueImpl(1.0/::log(10.0)), flags);
- object->setProperty(QLatin1String("PI"),
- QScriptValueImpl(qt_PI), flags);
- object->setProperty(QLatin1String("SQRT1_2"),
- QScriptValueImpl(::sqrt(0.5)), flags);
- object->setProperty(QLatin1String("SQRT2"),
- QScriptValueImpl(::sqrt(2.0)), flags);
-
- flags = QScriptValue::SkipInEnumeration;
- addFunction(*object, QLatin1String("abs"), method_abs, 1, flags);
- addFunction(*object, QLatin1String("acos"), method_acos, 1, flags);
- addFunction(*object, QLatin1String("asin"), method_asin, 0, flags);
- addFunction(*object, QLatin1String("atan"), method_atan, 1, flags);
- addFunction(*object, QLatin1String("atan2"), method_atan2, 2, flags);
- addFunction(*object, QLatin1String("ceil"), method_ceil, 1, flags);
- addFunction(*object, QLatin1String("cos"), method_cos, 1, flags);
- addFunction(*object, QLatin1String("exp"), method_exp, 1, flags);
- addFunction(*object, QLatin1String("floor"), method_floor, 1, flags);
- addFunction(*object, QLatin1String("log"), method_log, 1, flags);
- addFunction(*object, QLatin1String("max"), method_max, 2, flags);
- addFunction(*object, QLatin1String("min"), method_min, 2, flags);
- addFunction(*object, QLatin1String("pow"), method_pow, 2, flags);
- addFunction(*object, QLatin1String("random"), method_random, 0, flags);
- addFunction(*object, QLatin1String("round"), method_round, 1, flags);
- addFunction(*object, QLatin1String("sin"), method_sin, 1, flags);
- addFunction(*object, QLatin1String("sqrt"), method_sqrt, 1, flags);
- addFunction(*object, QLatin1String("tan"), method_tan, 1, flags);
-}
-
-/* copies the sign from y to x and returns the result */
-static qsreal copySign(qsreal x, qsreal y)
-{
- uchar *xch = (uchar *)&x;
- uchar *ych = (uchar *)&y;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian)
- xch[0] = (xch[0] & 0x7f) | (ych[0] & 0x80);
- else
- xch[7] = (xch[7] & 0x7f) | (ych[7] & 0x80);
- return x;
-}
-
-QScriptValueImpl Math::method_abs(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- if (v == 0) // 0 | -0
- return (QScriptValueImpl(0));
- else
- return (QScriptValueImpl(v < 0 ? -v : v));
-}
-
-QScriptValueImpl Math::method_acos(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- if (v > 1)
- return QScriptValueImpl(qSNaN());
- return (QScriptValueImpl(::acos(v)));
-}
-
-QScriptValueImpl Math::method_asin(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- if (v > 1)
- return QScriptValueImpl(qSNaN());
- return (QScriptValueImpl(::asin(v)));
-}
-
-QScriptValueImpl Math::method_atan(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- if (v == 0.0)
- return QScriptValueImpl(v);
- return (QScriptValueImpl(::atan(v)));
-}
-
-QScriptValueImpl Math::method_atan2(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v1 = context->argument(0).toNumber();
- qsreal v2 = context->argument(1).toNumber();
-#ifdef Q_OS_WINCE
- if (v1 == 0.0) {
- const bool v1MinusZero = _copysign(1.0, v1) < 0.0;
- const bool v2MinusZero = (v2 == 0 && _copysign(1.0, v2) < 0.0);
- if ((v1MinusZero && v2MinusZero) || (v1MinusZero && v2 == -1.0))
- return QScriptValueImpl(-qt_PI);
- if (v2MinusZero)
- return QScriptValueImpl(qt_PI);
- if (v1MinusZero && v2 == 1.0)
- return QScriptValueImpl(-0.0);
-#if defined(_X86_)
- if (v2 == 0.0 && (v1MinusZero || (!v1MinusZero && !v2MinusZero)))
- return QScriptValueImpl(0.0);
-#endif
- }
-#endif
-#if defined(Q_OS_WINCE) && defined(_X86_)
- if (v1 == -1.0 && !_finite(v2) && _copysign(1.0, v2) > 0.0)
- return QScriptValueImpl(-0.0);
-#endif
- if ((v1 < 0) && qIsFinite(v1) && qIsInf(v2) && (copySign(1.0, v2) == 1.0))
- return QScriptValueImpl(copySign(0, -1.0));
- if ((v1 == 0.0) && (v2 == 0.0)) {
- if ((copySign(1.0, v1) == 1.0) && (copySign(1.0, v2) == -1.0))
- return QScriptValueImpl(qt_PI);
- else if ((copySign(1.0, v1) == -1.0) && (copySign(1.0, v2) == -1.0))
- return QScriptValueImpl(-qt_PI);
- }
- return (QScriptValueImpl(::atan2(v1, v2)));
-}
-
-QScriptValueImpl Math::method_ceil(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- if (v < 0.0 && v > -1.0)
- return QScriptValueImpl(copySign(0, -1.0));
- return (QScriptValueImpl(::ceil(v)));
-}
-
-QScriptValueImpl Math::method_cos(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- return (QScriptValueImpl(::cos(v)));
-}
-
-QScriptValueImpl Math::method_exp(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- if (qIsInf(v)) {
- if (copySign(1.0, v) == -1.0)
- return QScriptValueImpl(0);
- else
- return QScriptValueImpl(qInf());
- }
- return (QScriptValueImpl(::exp(v)));
-}
-
-QScriptValueImpl Math::method_floor(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- return (QScriptValueImpl(::floor(v)));
-}
-
-QScriptValueImpl Math::method_log(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- if (v < 0)
- return QScriptValueImpl(qSNaN());
- return (QScriptValueImpl(::log(v)));
-}
-
-QScriptValueImpl Math::method_max(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal mx = -qInf();
- for (int i = 0; i < context->argumentCount(); ++i) {
- qsreal x = context->argument(i).toNumber();
- if (x > mx || qIsNaN(x))
- mx = x;
- }
- return (QScriptValueImpl(mx));
-}
-
-QScriptValueImpl Math::method_min(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal mx = qInf();
- for (int i = 0; i < context->argumentCount(); ++i) {
- qsreal x = context->argument(i).toNumber();
- if ((x == 0 && mx == x && copySign(1.0, x) == -1.0)
- || (x < mx) || qIsNaN(x)) {
- mx = x;
- }
- }
- return (QScriptValueImpl(mx));
-}
-
-QScriptValueImpl Math::method_pow(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal x = context->argument(0).toNumber();
- qsreal y = context->argument(1).toNumber();
- if (qIsNaN(y))
- return QScriptValueImpl(qSNaN());
- if (y == 0)
- return QScriptValueImpl(1);
- if (((x == 1) || (x == -1)) && qIsInf(y))
- return QScriptValueImpl(qSNaN());
- if (((x == 0) && copySign(1.0, x) == 1.0) && (y < 0))
- return QScriptValueImpl(qInf());
- if ((x == 0) && copySign(1.0, x) == -1.0) {
- if (y < 0) {
- if (::fmod(-y, 2.0) == 1.0)
- return QScriptValueImpl(-qInf());
- else
- return QScriptValueImpl(qInf());
- } else if (y > 0) {
- if (::fmod(y, 2.0) == 1.0)
- return QScriptValueImpl(copySign(0, -1.0));
- else
- return QScriptValueImpl(0);
- }
- }
-#ifdef Q_OS_AIX
- if (qIsInf(x) && copySign(1.0, x) == -1.0) {
- if (y > 0) {
- if (::fmod(y, 2.0) == 1.0)
- return QScriptValueImpl(-qInf());
- else
- return QScriptValueImpl(qInf());
- } else if (y < 0) {
- if (::fmod(-y, 2.0) == 1.0)
- return QScriptValueImpl(copySign(0, -1.0));
- else
- return QScriptValueImpl(0);
- }
- }
-#endif
- return (QScriptValueImpl(::pow(x, y)));
-}
-
-QScriptValueImpl Math::method_random(QScriptContextPrivate *,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- return (QScriptValueImpl(qrand() / (qsreal) RAND_MAX));
-}
-
-QScriptValueImpl Math::method_round(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- v = copySign(::floor(v + 0.5), v);
- return (QScriptValueImpl(v));
-}
-
-QScriptValueImpl Math::method_sin(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- return (QScriptValueImpl(::sin(v)));
-}
-
-QScriptValueImpl Math::method_sqrt(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- return (QScriptValueImpl(::sqrt(v)));
-}
-
-QScriptValueImpl Math::method_tan(QScriptContextPrivate *context,
- QScriptEnginePrivate *,
- QScriptClassInfo *)
-{
- qsreal v = context->argument(0).toNumber();
- if (v == 0.0)
- return QScriptValueImpl(v);
- return (QScriptValueImpl(::tan(v)));
-}
-
-void Math::addFunction(QScriptValueImpl &object, const QString &name,
- QScriptInternalFunctionSignature fun, int length,
- const QScriptValue::PropertyFlags flags)
-{
- QScriptEnginePrivate *eng_p = object.engine();
- QScriptValueImpl val = eng_p->createFunction(fun, length, object.classInfo(), name);
- object.setProperty(name, val, flags);
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmamath_p.h b/src/script/qscriptecmamath_p.h
deleted file mode 100644
index 3a850c2..0000000
--- a/src/script/qscriptecmamath_p.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMAMATH_P_H
-#define QSCRIPTECMAMATH_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptobjectdata_p.h"
-#include "qscriptfunction_p.h"
-#include "qscriptvalue.h"
-
-QT_BEGIN_NAMESPACE
-
-class QScriptEnginePrivate;
-class QScriptContextPrivate;
-class QScriptClassInfo;
-class QScriptValueImpl;
-
-#ifndef QT_NO_SCRIPT
-
-namespace QScript { namespace Ecma {
-
-class Math: public QScriptObjectData
-{
-protected:
- Math(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo);
-
-public:
- virtual ~Math();
-
- static void construct(QScriptValueImpl *object, QScriptEnginePrivate *eng);
-
- inline QScriptEnginePrivate *engine() const;
-
-protected:
- static QScriptValueImpl method_abs(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_acos(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_asin(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_atan(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_atan2(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_ceil(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_cos(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_exp(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_floor(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_log(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_max(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_min(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_pow(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_random(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_round(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_sin(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_sqrt(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_tan(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-
-private:
- static void addFunction(QScriptValueImpl &object, const QString &name,
- QScriptInternalFunctionSignature fun, int length,
- const QScriptValue::PropertyFlags flags);
-
- QScriptEnginePrivate *m_engine;
- QScriptClassInfo *m_classInfo;
-};
-
-inline QScriptEnginePrivate *Math::engine() const
-{ return m_engine; }
-
-
-} } // namespace QScript::Ecma
-
-#endif // QT_NO_SCRIPT
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptecmanumber.cpp b/src/script/qscriptecmanumber.cpp
deleted file mode 100644
index 7d3d903..0000000
--- a/src/script/qscriptecmanumber.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmanumber_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QtDebug>
-#include <QtCore/qnumeric.h>
-#include <math.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-Number::Number(QScriptEnginePrivate *eng):
- Core(eng, QLatin1String("Number"), QScriptClassInfo::NumberType)
-{
- newNumber(&publicPrototype, 0);
-
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
- addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 0);
- addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0);
- addPrototypeFunction(QLatin1String("toFixed"), method_toFixed, 1);
- addPrototypeFunction(QLatin1String("toExponential"), method_toExponential, 1);
- addPrototypeFunction(QLatin1String("toPrecision"), method_toPrecision, 1);
-
- QScriptValue::PropertyFlags flags = QScriptValue::Undeletable
- | QScriptValue::ReadOnly
- | QScriptValue::SkipInEnumeration;
- ctor.setProperty(QLatin1String("NaN"),
- QScriptValueImpl(qSNaN()), flags);
- ctor.setProperty(QLatin1String("NEGATIVE_INFINITY"),
- QScriptValueImpl(-qInf()), flags);
- ctor.setProperty(QLatin1String("POSITIVE_INFINITY"),
- QScriptValueImpl(qInf()), flags);
- ctor.setProperty(QLatin1String("MAX_VALUE"),
- QScriptValueImpl(1.7976931348623158e+308), flags);
-#ifdef __INTEL_COMPILER
-# pragma warning( push )
-# pragma warning(disable: 239)
-#endif
- ctor.setProperty(QLatin1String("MIN_VALUE"),
- QScriptValueImpl(5e-324), flags);
-#ifdef __INTEL_COMPILER
-# pragma warning( pop )
-#endif
-}
-
-Number::~Number()
-{
-}
-
-void Number::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- qsreal value;
- if (context->argumentCount() > 0)
- value = context->argument(0).toNumber();
- else
- value = 0;
-
- QScriptValueImpl num(value);
- if (!context->isCalledAsConstructor()) {
- context->setReturnValue(num);
- } else {
- QScriptValueImpl &obj = context->m_thisObject;
- obj.setClassInfo(classInfo());
- obj.setInternalValue(num);
- obj.setPrototype(publicPrototype);
- context->setReturnValue(obj);
- }
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-void Number::newNumber(QScriptValueImpl *result, qsreal value)
-{
- engine()->newObject(result, publicPrototype, classInfo());
- result->setInternalValue(QScriptValueImpl(value));
-}
-
-QScriptValueImpl Number::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("Number.prototype.toString"));
- }
- QScriptValueImpl arg = context->argument(0);
- if (!arg.isUndefined()) {
- int radix = arg.toInt32();
- if (radix < 2 || radix > 36)
- return context->throwError(QString::fromLatin1("Number.prototype.toString: %0 is not a valid radix")
- .arg(radix));
- if (radix != 10) {
- QString str;
- qsreal num = self.internalValue().toNumber();
- if (qIsNaN(num))
- return QScriptValueImpl(eng, QLatin1String("NaN"));
- else if (qIsInf(num))
- return QScriptValueImpl(eng, QLatin1String(num < 0 ? "-Infinity" : "Infinity"));
- bool negative = false;
- if (num < 0) {
- negative = true;
- num = -num;
- }
- qsreal frac = num - ::floor(num);
- num = QScriptEnginePrivate::toInteger(num);
- do {
- char c = (char)::fmod(num, radix);
- c = (c < 10) ? (c + '0') : (c - 10 + 'a');
- str.prepend(QLatin1Char(c));
- num = ::floor(num / radix);
- } while (num != 0);
- if (frac != 0) {
- str.append(QLatin1Char('.'));
- do {
- frac = frac * radix;
- char c = (char)::floor(frac);
- c = (c < 10) ? (c + '0') : (c - 10 + 'a');
- str.append(QLatin1Char(c));
- frac = frac - ::floor(frac);
- } while (frac != 0);
- }
- if (negative)
- str.prepend(QLatin1Char('-'));
- return QScriptValueImpl(eng, str);
- }
- }
- QString str = self.internalValue().toString();
- return (QScriptValueImpl(eng, str));
-}
-
-QScriptValueImpl Number::method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("Number.prototype.toLocaleString"));
- }
- QString str = self.internalValue().toString();
- return (QScriptValueImpl(eng, str));
-}
-
-QScriptValueImpl Number::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("Number.prototype.valueOf"));
- }
- return (self.internalValue());
-}
-
-QScriptValueImpl Number::method_toFixed(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("Number.prototype.toFixed"));
- }
- qsreal fdigits = 0;
-
- if (context->argumentCount() > 0)
- fdigits = context->argument(0).toInteger();
-
- if (qIsNaN(fdigits))
- fdigits = 0;
-
- qsreal v = self.internalValue().toNumber();
- QString str;
- if (qIsNaN(v))
- str = QString::fromLatin1("NaN");
- else if (qIsInf(v))
- str = QString::fromLatin1(v < 0 ? "-Infinity" : "Infinity");
- else
- str = QString::number(v, 'f', int (fdigits));
- return (QScriptValueImpl(eng, str));
-}
-
-QScriptValueImpl Number::method_toExponential(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("Number.prototype.toExponential"));
- }
- qsreal fdigits = 0;
-
- if (context->argumentCount() > 0)
- fdigits = context->argument(0).toInteger();
-
- qsreal v = self.internalValue().toNumber();
- QString z = QString::number(v, 'e', int (fdigits));
- return (QScriptValueImpl(eng, z));
-}
-
-QScriptValueImpl Number::method_toPrecision(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("Number.prototype.toPrecision"));
- }
- qsreal fdigits = 0;
-
- if (context->argumentCount() > 0)
- fdigits = context->argument(0).toInteger();
-
- qsreal v = self.internalValue().toNumber();
- return (QScriptValueImpl(eng, QString::number(v, 'g', int (fdigits))));
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmanumber_p.h b/src/script/qscriptecmanumber_p.h
deleted file mode 100644
index 55e2cf9..0000000
--- a/src/script/qscriptecmanumber_p.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMANUMBER_P_H
-#define QSCRIPTECMANUMBER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptecmacore_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class Number: public Core
-{
-public:
- Number(QScriptEnginePrivate *engine);
- virtual ~Number();
-
- virtual void execute(QScriptContextPrivate *context);
-
- void newNumber(QScriptValueImpl *result, double value = 0);
-
-protected:
- static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
- static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toFixed(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toExponential(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toPrecision(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
-};
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptecmaobject.cpp b/src/script/qscriptecmaobject.cpp
deleted file mode 100644
index c4a1b08..0000000
--- a/src/script/qscriptecmaobject.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmaobject_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QtDebug>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-Object::Object(QScriptEnginePrivate *eng, QScriptClassInfo *classInfo):
- Core(eng, classInfo)
-{
- newObject(&publicPrototype, eng->nullValue());
-}
-
-Object::~Object()
-{
-}
-
-void Object::initialize()
-{
- QScriptEnginePrivate *eng = engine();
-
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("toString"), method_toString, 1);
- addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 1);
- addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0);
- addPrototypeFunction(QLatin1String("hasOwnProperty"), method_hasOwnProperty, 1);
- addPrototypeFunction(QLatin1String("isPrototypeOf"), method_isPrototypeOf, 1);
- addPrototypeFunction(QLatin1String("propertyIsEnumerable"), method_propertyIsEnumerable, 1);
- addPrototypeFunction(QLatin1String("__defineGetter__"), method_defineGetter, 2);
- addPrototypeFunction(QLatin1String("__defineSetter__"), method_defineSetter, 2);
-}
-
-void Object::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- QScriptValueImpl value;
-
- if (context->argumentCount() > 0)
- value = engine()->toObject(context->argument(0));
- else
- value.invalidate();
-
- if (! value.isValid())
- newObject(&value);
-
- context->setReturnValue(value);
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-void Object::newObject(QScriptValueImpl *result, const QScriptValueImpl &proto)
-{
- engine()->newObject(result, proto, classInfo());
-}
-
-QScriptValueImpl Object::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl glo = eng->globalObject();
- QString s = QLatin1String("[object ");
- QScriptValueImpl self = context->thisObject();
- s += self.classInfo()->name();
- s += QLatin1Char(']');
- return (QScriptValueImpl(eng, s));
-}
-
-QScriptValueImpl Object::method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- return method_toString(context, eng, classInfo);
-}
-
-QScriptValueImpl Object::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- return (context->thisObject());
-}
-
-QScriptValueImpl Object::method_hasOwnProperty(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- bool result = false;
-
- if (context->thisObject().isObject() && (context->argumentCount() > 0)) {
- QScriptValueImpl arg = context->argument(0);
-
- QScriptNameIdImpl *id = 0;
- if (arg.isString())
- id = arg.stringValue();
-
- if (! id || ! id->unique) {
- QString str = arg.toString();
- id = eng->nameId(str);
- }
-
- QScript::Member member;
- QScriptValueImpl base;
- QScriptValueImpl self = context->thisObject();
- if (self.resolve(id, &member, &base, QScriptValue::ResolveLocal, QScript::Read))
- result = true;
- }
-
- return (QScriptValueImpl(result));
-}
-
-QScriptValueImpl Object::method_isPrototypeOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- bool result = false;
-
- if (context->thisObject().isObject() && (context->argumentCount() > 0)) {
- QScriptValueImpl arg = context->argument(0);
-
- if (arg.isObject()) {
- QScriptValueImpl proto = arg.prototype();
-
- if (proto.isObject()) {
- QScriptValueImpl self = context->thisObject();
- result = self.objectValue() == proto.objectValue();
- }
- }
- }
-
- return (QScriptValueImpl(result));
-}
-
-QScriptValueImpl Object::method_propertyIsEnumerable(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- bool result = false;
-
- if (context->thisObject().isObject() && (context->argumentCount() > 0)) {
- QScriptValueImpl arg = context->argument(0);
-
- QScriptNameIdImpl *id = 0;
- if (arg.isString())
- id = arg.stringValue();
-
- if (! id || ! id->unique) {
- QString str = arg.toString();
- id = eng->nameId(str);
- }
-
- QScript::Member member;
- QScriptValueImpl base;
- QScriptValueImpl self = context->thisObject();
- if (self.resolve(id, &member, &base, QScriptValue::ResolveLocal, QScript::Read)) {
- result = ! member.dontEnum();
- if (result) {
- QScriptValueImpl tmp;
- base.get(member, &tmp);
- result = tmp.isValid();
- }
- }
- }
-
- return (QScriptValueImpl(result));
-}
-
-QScriptValueImpl Object::method_defineGetter(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QString propertyName = context->argument(0).toString();
- if (context->thisObject().propertyFlags(propertyName) & QScriptValue::ReadOnly)
- return context->throwError(QLatin1String("cannot redefine read-only property"));
- QScriptValueImpl getter = context->argument(1);
- if (!getter.isFunction())
- return context->throwError(QLatin1String("getter must be a function"));
- context->thisObject().setProperty(propertyName, getter, QScriptValue::PropertyGetter);
- return eng->undefinedValue();
-}
-
-QScriptValueImpl Object::method_defineSetter(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QString propertyName = context->argument(0).toString();
- if (context->thisObject().propertyFlags(propertyName) & QScriptValue::ReadOnly)
- return context->throwError(QLatin1String("cannot redefine read-only property"));
- QScriptValueImpl setter = context->argument(1);
- if (!setter.isFunction())
- return context->throwError(QLatin1String("setter must be a function"));
- context->thisObject().setProperty(propertyName, setter, QScriptValue::PropertySetter);
- return eng->undefinedValue();
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmaobject_p.h b/src/script/qscriptecmaobject_p.h
deleted file mode 100644
index d55a425..0000000
--- a/src/script/qscriptecmaobject_p.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMAOBJECT_P_H
-#define QSCRIPTECMAOBJECT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptecmacore_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class Object: public Core
-{
-public:
- Object(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo);
- virtual ~Object();
-
- void initialize();
-
- virtual void execute(QScriptContextPrivate *context);
-
- void newObject(QScriptValueImpl *result, const QScriptValueImpl &proto = QScriptValueImpl());
-
-protected:
- static QScriptValueImpl method_toString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLocaleString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_valueOf(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_hasOwnProperty(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_isPrototypeOf(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_propertyIsEnumerable(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_defineGetter(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_defineSetter(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-};
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptecmaregexp.cpp b/src/script/qscriptecmaregexp.cpp
deleted file mode 100644
index 4aef611..0000000
--- a/src/script/qscriptecmaregexp.cpp
+++ /dev/null
@@ -1,339 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmaregexp_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QStringList>
-#include <QtCore/QRegExp>
-#include <QtCore/QtDebug>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-RegExp::RegExp(QScriptEnginePrivate *eng):
- Core(eng, QLatin1String("RegExp"), QScriptClassInfo::RegExpType)
-{
- newRegExp(&publicPrototype, QString(), /*flags=*/0);
-
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("exec"), method_exec, 1);
- addPrototypeFunction(QLatin1String("test"), method_test, 1);
- addPrototypeFunction(QLatin1String("toString"), method_toString, 1);
-}
-
-RegExp::~RegExp()
-{
-}
-
-RegExp::Instance *RegExp::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass)
-{
- if (! klass || klass == object.classInfo())
- return static_cast<Instance*> (object.objectData());
-
- return 0;
-}
-
-void RegExp::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- QString P;
- int F;
- QScriptValueImpl pattern = context->argument(0);
- QScriptValueImpl flags = context->argument(1);
- if (!context->isCalledAsConstructor()) {
- if ((pattern.classInfo() == classInfo()) && flags.isUndefined()) {
- context->m_result = pattern;
- goto Lout;
- }
- }
- if (pattern.classInfo() == classInfo()) {
- if (!flags.isUndefined()) {
- context->throwTypeError(QString::fromLatin1("cannot specify flags when creating a copy of a RegExp"));
- goto Lout;
- }
- Instance *data = Instance::get(pattern, classInfo());
-#ifndef QT_NO_REGEXP
- P = data->value.pattern();
-#else
- P = data->pattern;
-#endif
- F = data->flags;
- } else {
- if (!pattern.isUndefined())
- P = pattern.toString();
- F = 0;
- if (!flags.isUndefined()) {
- QString flagsStr = flags.toString();
- for (int i = 0; i < flagsStr.length(); ++i) {
- int bitflag = flagFromChar(flagsStr.at(i));
- if (bitflag == 0) {
- context->throwError(
- QScriptContext::SyntaxError,
- QString::fromUtf8("invalid regular expression flag '%0'")
- .arg(flagsStr.at(i)));
- goto Lout;
- }
- F |= bitflag;
- }
- }
- }
- if (context->isCalledAsConstructor()) {
- QScriptValueImpl &object = context->m_thisObject;
- object.setClassInfo(classInfo());
- object.setPrototype(publicPrototype);
-#ifndef QT_NO_REGEXP
- initRegExp(&object, toRegExp(P, F), F);
-#else
- initRegExp(&object, P, F);
-#endif
- } else {
- newRegExp(&context->m_result, P, F);
- }
- Lout: ;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-void RegExp::newRegExp(QScriptValueImpl *result, const QString &pattern, int flags)
-{
-#ifndef QT_NO_REGEXP
- QRegExp rx = toRegExp(pattern, flags);
- newRegExp_helper(result, rx, flags);
-#else
- engine()->newObject(result, publicPrototype, classInfo());
- initRegExp(result, pattern, flags);
-#endif // QT_NO_REGEXP
-}
-
-#ifndef QT_NO_REGEXP
-void RegExp::newRegExp(QScriptValueImpl *result, const QRegExp &rx, int flags)
-{
- Q_ASSERT(!(flags & IgnoreCase) || (rx.caseSensitivity() == Qt::CaseInsensitive));
- newRegExp_helper(result, rx, flags);
-}
-
-void RegExp::newRegExp_helper(QScriptValueImpl *result, const QRegExp &rx,
- int flags)
-{
- engine()->newObject(result, publicPrototype, classInfo());
- initRegExp(result, rx, flags);
-}
-
-QRegExp RegExp::toRegExp(const QScriptValueImpl &value) const
-{
- Instance *rx_data = Instance::get(value, classInfo());
- Q_ASSERT(rx_data != 0);
- return rx_data->value;
-}
-
-QRegExp RegExp::toRegExp(const QString &pattern, int flags)
-{
- bool ignoreCase = (flags & IgnoreCase) != 0;
- return QRegExp(pattern,
- (ignoreCase ? Qt::CaseInsensitive: Qt::CaseSensitive),
- QRegExp::RegExp2);
-}
-
-#endif // QT_NO_REGEXP
-
-void RegExp::initRegExp(QScriptValueImpl *result,
-#ifndef QT_NO_REGEXP
- const QRegExp &rx,
-#else
- const QString &pattern,
-#endif
- int flags)
-{
- Instance *instance = new Instance();
-#ifndef QT_NO_REGEXP
- instance->value = rx;
-#else
- instance->pattern = pattern;
-#endif
- instance->flags = flags;
- result->setObjectData(instance);
-
- bool global = (flags & Global) != 0;
- bool ignoreCase = (flags & IgnoreCase) != 0;
- bool multiline = (flags & Multiline) != 0;
-
- QScriptValue::PropertyFlags propertyFlags = QScriptValue::SkipInEnumeration
- | QScriptValue::Undeletable
- | QScriptValue::ReadOnly;
-
- result->setProperty(QLatin1String("global"), QScriptValueImpl(global),
- propertyFlags);
- result->setProperty(QLatin1String("ignoreCase"), QScriptValueImpl(ignoreCase),
- propertyFlags);
- result->setProperty(QLatin1String("multiline"), QScriptValueImpl(multiline),
- propertyFlags);
-#ifndef QT_NO_REGEXP
- const QString &pattern = rx.pattern();
-#endif
- result->setProperty(QLatin1String("source"), QScriptValueImpl(engine(), pattern),
- propertyFlags);
- result->setProperty(QLatin1String("lastIndex"), QScriptValueImpl(0),
- propertyFlags & ~QScriptValue::ReadOnly);
-}
-
-int RegExp::flagFromChar(const QChar &ch)
-{
- static QHash<QChar, int> flagsHash;
- if (flagsHash.isEmpty()) {
- flagsHash[QLatin1Char('g')] = Global;
- flagsHash[QLatin1Char('i')] = IgnoreCase;
- flagsHash[QLatin1Char('m')] = Multiline;
- }
- QHash<QChar, int>::const_iterator it;
- it = flagsHash.constFind(ch);
- if (it == flagsHash.constEnd())
- return 0;
- return it.value();
-}
-
-QString RegExp::flagsToString(int flags)
-{
- QString result;
- if (flags & Global)
- result += QLatin1Char('g');
- if (flags & IgnoreCase)
- result += QLatin1Char('i');
- if (flags & Multiline)
- result += QLatin1Char('m');
- return result;
-}
-
-QScriptValueImpl RegExp::method_exec(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("RegExp.prototype.exec"));
- }
- Instance *rx_data = Instance::get(self, classInfo);
- Q_ASSERT(rx_data != 0);
-
- QString S = context->argument(0).toString();
- int length = S.length();
- QScriptValueImpl lastIndex = self.property(QLatin1String("lastIndex"));
-
- int i = lastIndex.isValid() ? int (lastIndex.toInteger()) : 0;
- bool global = self.property(QLatin1String("global")).toBoolean();
-
- if (! global)
- i = 0;
-
- if (i < 0 || i >= length)
- return (eng->nullValue());
-
-#ifndef QT_NO_REGEXP
- int index = rx_data->value.indexIn(S, i);
- if (index == -1)
-#endif // QT_NO_REGEXP
- return eng->nullValue();
-
-#ifndef QT_NO_REGEXP
- int e = index + rx_data->value.matchedLength();
-
- if (global)
- self.setProperty(QLatin1String("lastIndex"), QScriptValueImpl(e));
-
- QScript::Array elts(eng);
- QStringList capturedTexts = rx_data->value.capturedTexts();
- for (int i = 0; i < capturedTexts.count(); ++i)
- elts.assign(i, QScriptValueImpl(eng, capturedTexts.at(i)));
-
- QScriptValueImpl r = eng->newArray(elts);
-
- r.setProperty(QLatin1String("index"), QScriptValueImpl(index));
- r.setProperty(QLatin1String("input"), QScriptValueImpl(eng, S));
-
- return r;
-#endif // QT_NO_REGEXP
-}
-
-QScriptValueImpl RegExp::method_test(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl r = method_exec(context, eng, classInfo);
- return QScriptValueImpl(!r.isNull());
-}
-
-QScriptValueImpl RegExp::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- if (Instance *instance = Instance::get(context->thisObject(), classInfo)) {
- QString result;
- result += QLatin1Char('/');
-#ifndef QT_NO_REGEXP
- const QString &pattern = instance->value.pattern();
-#else
- const QString &pattern = instance->pattern;
-#endif
- if (pattern.isEmpty())
- result += QLatin1String("(?:)");
- else
- result += pattern; // ### quote
- result += QLatin1Char('/');
- result += flagsToString(instance->flags);
- return (QScriptValueImpl(eng, result));
- }
-
- return throwThisObjectTypeError(
- context, QLatin1String("RegExp.prototype.toString"));
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmaregexp_p.h b/src/script/qscriptecmaregexp_p.h
deleted file mode 100644
index 77fe467..0000000
--- a/src/script/qscriptecmaregexp_p.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMAREGEXP_P_H
-#define QSCRIPTECMAREGEXP_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/QRegExp>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptecmacore_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class RegExp: public Core
-{
-public:
- enum RegExpFlag {
- Global = 0x01,
- IgnoreCase = 0x02,
- Multiline = 0x04
- };
-
- RegExp(QScriptEnginePrivate *engine);
- virtual ~RegExp();
-
- virtual void execute(QScriptContextPrivate *context);
-
- class Instance: public QScriptObjectData {
- public:
- Instance() : flags(0) {}
- virtual ~Instance() {}
-
- static Instance *get(const QScriptValueImpl &object,
- QScriptClassInfo *klass);
-
- public: // attributes
-#ifndef QT_NO_REGEXP
- QRegExp value;
-#else
- QString pattern;
-#endif
- int flags;
- };
-
- inline Instance *get(const QScriptValueImpl &object) const
- { return Instance::get(object, classInfo()); }
-
- void newRegExp(QScriptValueImpl *result, const QString &pattern,
- int flags);
-#ifndef QT_NO_REGEXP
- void newRegExp(QScriptValueImpl *result, const QRegExp &rx,
- int flags = 0);
- QRegExp toRegExp(const QScriptValueImpl &value) const;
- static QRegExp toRegExp(const QString &pattern, int flags);
-#endif
-
- static int flagFromChar(const QChar &ch);
- static QString flagsToString(int flags);
-
-protected:
- static QScriptValueImpl method_exec(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_test(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toString(QScriptContextPrivate *context,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-
-private:
-#ifndef QT_NO_REGEXP
- void newRegExp_helper(QScriptValueImpl *result, const QRegExp &rx,
- int flags);
-#endif
- void initRegExp(QScriptValueImpl *result,
-#ifndef QT_NO_REGEXP
- const QRegExp &rx,
-#else
- const QString &pattern,
-#endif
- int flags);
-};
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTECMAREGEXP_P_H
diff --git a/src/script/qscriptecmastring.cpp b/src/script/qscriptecmastring.cpp
deleted file mode 100644
index 3c04375..0000000
--- a/src/script/qscriptecmastring.cpp
+++ /dev/null
@@ -1,778 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptecmastring_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptclassdata_p.h"
-
-#include <QtCore/QStringList>
-#include <QtCore/QtDebug>
-#include <QtCore/qnumeric.h>
-
-#include <limits.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class StringClassData: public QScriptClassData
-{
- QScriptClassInfo *m_classInfo;
-
-public:
- StringClassData(QScriptClassInfo *classInfo);
- virtual ~StringClassData();
-
- inline QScriptClassInfo *classInfo() const
- { return m_classInfo; }
-
- virtual bool resolve(const QScriptValueImpl &object,
- QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode access);
- virtual bool get(const QScriptValueImpl &object, const Member &member,
- QScriptValueImpl *out_value);
- virtual bool put(QScriptValueImpl *object, const Member &member,
- const QScriptValueImpl &value);
- virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object);
-};
-
-class StringClassDataIterator: public QScriptClassDataIterator
-{
-public:
- StringClassDataIterator(int length);
- virtual ~StringClassDataIterator();
-
- virtual bool hasNext() const;
- virtual void next(QScript::Member *member);
-
- virtual bool hasPrevious() const;
- virtual void previous(QScript::Member *member);
-
- virtual void toFront();
- virtual void toBack();
-
-private:
- int m_length;
- int m_pos;
-};
-
-StringClassData::StringClassData(QScriptClassInfo *classInfo):
- m_classInfo(classInfo)
-{
-}
-
-StringClassData::~StringClassData()
-{
-}
-
-bool StringClassData::resolve(const QScriptValueImpl &object,
- QScriptNameIdImpl *nameId,
- QScript::Member *member,
- QScriptValueImpl *base,
- QScript::AccessMode /*access*/)
-{
- if (object.classInfo() != classInfo())
- return false;
-
- QScriptEnginePrivate *eng = object.engine();
-
- if (nameId == eng->idTable()->id_length) {
- member->native(nameId, /*id=*/ 0,
- QScriptValue::Undeletable
- | QScriptValue::ReadOnly
- | QScriptValue::SkipInEnumeration);
- *base = object;
- return true;
- }
-
- bool ok = false;
- int index = nameId->s.toInt(&ok);
- if (!ok || (index < 0))
- return false;
-
- QScriptNameIdImpl *ref = object.internalValue().stringValue();
- if (index >= ref->s.length())
- return false;
-
- member->native(nameId, index, QScriptValue::Undeletable | QScriptValue::ReadOnly);
- return true;
-}
-
-bool StringClassData::get(const QScriptValueImpl &object,
- const QScript::Member &member,
- QScriptValueImpl *result)
-{
- Q_ASSERT(member.isValid());
-
- if (object.classInfo() != classInfo())
- return false;
-
- QScriptEnginePrivate *eng = object.engine();
- if (! member.isNativeProperty())
- return false;
-
- QScriptNameIdImpl *ref = object.internalValue().stringValue();
- int len = ref->s.length();
-
- if (member.nameId() == eng->idTable()->id_length)
- *result = QScriptValueImpl(len);
-
- else if (member.id() >= 0 && member.id() < len)
- eng->newString(result, ref->s.at(member.id()));
-
- else
- *result = eng->undefinedValue();
-
- return true;
-}
-
-bool StringClassData::put(QScriptValueImpl *, const Member &,
- const QScriptValueImpl &)
-{
- // writes to string elements are ignored
- return true;
-}
-
-QScriptClassDataIterator *StringClassData::newIterator(const QScriptValueImpl &object)
-{
- QScriptNameIdImpl *id = object.internalValue().stringValue();
- return new StringClassDataIterator(id->s.length());
-}
-
-StringClassDataIterator::StringClassDataIterator(int length)
-{
- m_length = length;
- m_pos = 0;
-}
-
-StringClassDataIterator::~StringClassDataIterator()
-{
-}
-
-bool StringClassDataIterator::hasNext() const
-{
- return m_pos < m_length;
-}
-
-void StringClassDataIterator::next(QScript::Member *member)
-{
- member->native(/*nameId=*/ 0, m_pos, QScriptValue::Undeletable | QScriptValue::ReadOnly);
- ++m_pos;
-}
-
-bool StringClassDataIterator::hasPrevious() const
-{
- return (m_pos - 1) >= 0;
-}
-
-void StringClassDataIterator::previous(QScript::Member *member)
-{
- --m_pos;
- member->native(/*nameId=*/ 0, m_pos, QScriptValue::Undeletable | QScriptValue::ReadOnly);
-}
-
-void StringClassDataIterator::toFront()
-{
- m_pos = 0;
-}
-
-void StringClassDataIterator::toBack()
-{
- m_pos = m_length;
-}
-
-
-
-String::String(QScriptEnginePrivate *eng):
- Core(eng, QLatin1String("String"), QScriptClassInfo::StringType)
-{
- classInfo()->setData(new StringClassData(classInfo()));
-
- newString(&publicPrototype, QString());
-
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
- addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0);
- addPrototypeFunction(QLatin1String("charAt"), method_charAt, 1);
- addPrototypeFunction(QLatin1String("charCodeAt"), method_charCodeAt, 1);
- addPrototypeFunction(QLatin1String("concat"), method_concat, 1);
- addPrototypeFunction(QLatin1String("indexOf"), method_indexOf, 1);
- addPrototypeFunction(QLatin1String("lastIndexOf"), method_lastIndexOf, 1);
- addPrototypeFunction(QLatin1String("localeCompare"), method_localeCompare, 1);
- addPrototypeFunction(QLatin1String("match"), method_match, 1);
- addPrototypeFunction(QLatin1String("replace"), method_replace, 2);
- addPrototypeFunction(QLatin1String("search"), method_search, 1);
- addPrototypeFunction(QLatin1String("slice"), method_slice, 2);
- addPrototypeFunction(QLatin1String("split"), method_split, 2);
- addPrototypeFunction(QLatin1String("substr"), method_substr, 2);
- addPrototypeFunction(QLatin1String("substring"), method_substring, 2);
- addPrototypeFunction(QLatin1String("toLowerCase"), method_toLowerCase, 0);
- addPrototypeFunction(QLatin1String("toLocaleLowerCase"), method_toLocaleLowerCase, 0);
- addPrototypeFunction(QLatin1String("toUpperCase"), method_toUpperCase, 0);
- addPrototypeFunction(QLatin1String("toLocaleUpperCase"), method_toLocaleUpperCase, 0);
-
- addConstructorFunction(QLatin1String("fromCharCode"), method_fromCharCode, 1);
-}
-
-String::~String()
-{
-}
-
-void String::execute(QScriptContextPrivate *context)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionEntry(context);
-#endif
- QString value;
-
- if (context->argumentCount() > 0)
- value = context->argument(0).toString();
-
- QScriptValueImpl str(engine(), value);
- if (!context->isCalledAsConstructor()) {
- context->setReturnValue(str);
- } else {
- QScriptValueImpl &obj = context->m_thisObject;
- obj.setClassInfo(classInfo());
- obj.setInternalValue(str);
- obj.setPrototype(publicPrototype);
- context->setReturnValue(obj);
- }
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine()->notifyFunctionExit(context);
-#endif
-}
-
-void String::newString(QScriptValueImpl *result, const QString &value)
-{
- engine()->newObject(result, publicPrototype, classInfo());
- result->setInternalValue(QScriptValueImpl(engine(), value));
-}
-
-QScriptValueImpl String::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return context->throwError(QScriptContext::TypeError, QLatin1String("String.prototype.toString"));
- }
- return (self.internalValue());
-}
-
-QScriptValueImpl String::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- QScriptValueImpl self = context->thisObject();
- if (self.classInfo() != classInfo) {
- return throwThisObjectTypeError(
- context, QLatin1String("String.prototype.valueOf"));
- }
- return (self.internalValue());
-}
-
-QScriptValueImpl String::method_charAt(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString str = context->thisObject().toString();
-
- int pos = 0;
- if (context->argumentCount() > 0)
- pos = int (context->argument(0).toInteger());
-
- QString result;
- if (pos >= 0 && pos < str.length())
- result += str.at(pos);
-
- return (QScriptValueImpl(eng, result));
-}
-
-QScriptValueImpl String::method_charCodeAt(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- QString str = context->thisObject().toString();
-
- int pos = 0;
- if (context->argumentCount() > 0)
- pos = int (context->argument(0).toInteger());
-
- qsreal result = qSNaN();
-
- if (pos >= 0 && pos < str.length())
- result = str.at(pos).unicode();
-
- return (QScriptValueImpl(result));
-}
-
-QScriptValueImpl String::method_concat(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
-
- for (int i = 0; i < context->argumentCount(); ++i)
- value += context->argument(i).toString();
-
- return (QScriptValueImpl(eng, value));
-}
-
-QScriptValueImpl String::method_indexOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
-
- QString searchString = context->argument(0).toString();
-
- int pos = 0;
- if (context->argumentCount() > 1)
- pos = int (context->argument(1).toInteger());
-
- int index = -1;
- if (! value.isEmpty())
- index = value.indexOf(searchString, qMin(qMax(pos, 0), value.length()));
-
- return (QScriptValueImpl(index));
-}
-
-QScriptValueImpl String::method_lastIndexOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
-
- QString searchString = context->argument(0).toString();
-
- qsreal position = context->argument(1).toNumber();
- if (qIsNaN(position))
- position = +qInf();
- else
- position = QScriptEnginePrivate::toInteger(position);
-
- int pos = QScriptEnginePrivate::toInt32(qMin(qMax(position, 0.0), qsreal(value.length())));
- if (!searchString.isEmpty() && pos == value.length())
- --pos;
- int index = value.lastIndexOf(searchString, pos);
- return (QScriptValueImpl(index));
-}
-
-QScriptValueImpl String::method_localeCompare(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
- QString that = context->argument(0).toString();
- return QScriptValueImpl(QString::localeAwareCompare(value, that));
-}
-
-QScriptValueImpl String::method_match(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl pattern = context->argument(0);
-
- if (! eng->regexpConstructor->get(pattern))
- eng->regexpConstructor->newRegExp(&pattern, context->argument(0).toString(), /*flags=*/0);
-
- QScriptValueImpl rx_exec = pattern.property(QLatin1String("exec"), QScriptValue::ResolvePrototype);
- if (! (rx_exec.isValid() && rx_exec.isFunction())) {
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("String.prototype.match"));
- }
-
- QScriptValueImplList args;
- args << context->thisObject();
-
- QScriptValueImpl global = pattern.property(QLatin1String("global"));
- if (! (global.isValid() && global.toBoolean()))
- return (rx_exec.call(pattern, args));
-
- QScript::Array result(eng);
-
- QScriptNameIdImpl *lastIndexId = eng->nameId(QLatin1String("lastIndex"));
- QScriptNameIdImpl *zeroId = eng->nameId(QLatin1String("0"));
-
- pattern.setProperty(lastIndexId, QScriptValueImpl(0));
- int n = 0;
- while (true) {
- qsreal lastIndex = pattern.property(lastIndexId).toNumber();
- QScriptValueImpl r = rx_exec.call(pattern, args);
- if (r.isNull())
- break;
- qsreal newLastIndex = pattern.property(lastIndexId).toNumber();
- if (newLastIndex == lastIndex)
- pattern.setProperty(lastIndexId, QScriptValueImpl(lastIndex + 1));
- result.assign(n++, r.property(zeroId));
- }
-
- return (eng->newArray(result));
-}
-
-QScriptValueImpl String::method_replace(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString input = context->thisObject().toString();
- QScriptValueImpl searchValue = context->argument(0);
- QScriptValueImpl replaceValue = context->argument(1);
-
- QString output;
- if (searchValue.classInfo() == eng->regexpConstructor->classInfo()) {
- // searchValue is a RegExp
- QScriptValueImpl rx_exec = searchValue.property(QLatin1String("exec"), QScriptValue::ResolvePrototype);
- if (!rx_exec.isFunction()) {
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("String.prototype.replace"));
- }
- QVector<QScriptValueImpl> occurrences;
- QScriptValueImpl global = searchValue.property(QLatin1String("global"));
- QScriptValueImplList args;
- args << QScriptValueImpl(eng, input);
- if (!global.toBoolean()) {
- QScriptValueImpl r = rx_exec.call(searchValue, args);
- if (!r.isNull())
- occurrences.append(r);
- } else {
- QScriptNameIdImpl *lastIndexId = eng->nameId(QLatin1String("lastIndex"));
- searchValue.setProperty(lastIndexId, QScriptValueImpl(0));
- while (true) {
- qsreal lastIndex = searchValue.property(lastIndexId).toNumber();
- QScriptValueImpl r = rx_exec.call(searchValue, args);
- if (r.isNull())
- break;
- qsreal newLastIndex = searchValue.property(lastIndexId).toNumber();
- if (newLastIndex == lastIndex)
- searchValue.setProperty(lastIndexId, QScriptValueImpl(lastIndex + 1));
- occurrences.append(r);
- }
- }
- int pos = 0;
- if (replaceValue.isFunction()) {
- QScriptNameIdImpl *indexId = eng->nameId(QLatin1String("index"));
- QScriptNameIdImpl *lengthId = eng->nameId(QLatin1String("length"));
- for (int i = 0; i < occurrences.count(); ++i) {
- QScriptValueImpl needle = occurrences.at(i);
- int index = int (needle.property(indexId).toInteger());
- uint length = eng->toUint32(needle.property(lengthId).toNumber());
- output += input.mid(pos, index - pos);
- args.clear();
- for (uint j = 0; j < length; ++j)
- args << needle.property(j);
- args << QScriptValueImpl(index);
- args << QScriptValueImpl(eng, input);
- QScriptValueImpl ret = replaceValue.call(eng->nullValue(), args);
- output += ret.toString();
- pos = index + args[0].toString().length();
- }
- } else {
- // use string representation of replaceValue
- const QString replaceString = replaceValue.toString();
- const QLatin1Char dollar = QLatin1Char('$');
- QScriptNameIdImpl *indexId = eng->nameId(QLatin1String("index"));
- QScriptNameIdImpl *zeroId = eng->nameId(QLatin1String("0"));
- for (int i = 0; i < occurrences.count(); ++i) {
- QScriptValueImpl needle = occurrences.at(i);
- int index = int (needle.property(indexId).toInteger());
- output += input.mid(pos, index - pos);
- int j = 0;
- while (j < replaceString.length()) {
- const QChar c = replaceString.at(j++);
- if ((c == dollar) && (j < replaceString.length())) {
- const QChar nc = replaceString.at(j);
- if (nc == dollar) {
- ++j;
- } else if (nc == QLatin1Char('`')) {
- ++j;
- output += input.left(index);
- continue;
- } else if (nc == QLatin1Char('\'')) {
- ++j;
- output += input.mid(index + needle.property(zeroId).toString().length());
- continue;
- } else if (nc.isDigit()) {
- ++j;
- int cap = nc.toLatin1() - '0';
- if ((j < replaceString.length()) && replaceString.at(j).isDigit()) {
- cap = cap * 10;
- cap = replaceString.at(j++).toLatin1() - '0';
- }
- output += needle.property(QScriptValueImpl(cap).toString()).toString();
- continue;
- }
- }
- output += c;
- }
- pos = index + needle.property(zeroId).toString().length();
- }
- }
- output += input.mid(pos);
- } else {
- // use string representation of searchValue
- const QString searchString = searchValue.toString();
- int pos = 0;
- if (replaceValue.isFunction()) {
- int index = input.indexOf(searchString, pos);
- if (index != -1) {
- output += input.mid(pos, index - pos);
- QScriptValueImplList args;
- args << QScriptValueImpl(eng, searchString);
- args << QScriptValueImpl(index);
- args << QScriptValueImpl(eng, input);
- QScriptValueImpl ret = replaceValue.call(eng->nullValue(), args);
- output += ret.toString();
- pos = index + searchString.length();
- }
- } else {
- // use string representation of replaceValue
- const QString replaceString = replaceValue.toString();
- const QLatin1Char dollar = QLatin1Char('$');
- int index = input.indexOf(searchString, pos);
- if (index != -1) {
- output += input.mid(pos, index - pos);
- int j = 0;
- while (j < replaceString.length()) {
- const QChar c = replaceString.at(j++);
- if ((c == dollar) && (j < replaceString.length())) {
- const QChar nc = replaceString.at(j);
- if (nc == dollar) {
- ++j;
- } else if (nc == QLatin1Char('`')) {
- output += input.left(index);
- ++j;
- continue;
- } else if (nc == QLatin1Char('\'')) {
- output += input.mid(index + searchString.length());
- ++j;
- continue;
- }
- }
- output += c;
- }
- pos = index + searchString.length();
- }
- }
- output += input.mid(pos);
- }
- return QScriptValueImpl(eng, output);
-}
-
-QScriptValueImpl String::method_search(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl pattern = context->argument(0);
-
- Ecma::RegExp::Instance *rx_data = 0;
- if (0 == (rx_data = eng->regexpConstructor->get(pattern))) {
- eng->regexpConstructor->newRegExp(&pattern, context->argument(0).toString(), /*flags=*/0);
- rx_data = eng->regexpConstructor->get(pattern);
- }
-
- QString value = context->thisObject().toString();
-#ifndef QT_NO_REGEXP
- return (QScriptValueImpl(value.indexOf(rx_data->value)));
-#else
- return eng->nullValue();
-#endif
-}
-
-QScriptValueImpl String::method_slice(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString text = context->thisObject().toString();
- int length = text.length();
-
- int start = int (context->argument(0).toInteger());
- int end = context->argument(1).isUndefined()
- ? length : int (context->argument(1).toInteger());
-
- if (start < 0)
- start = qMax(length + start, 0);
- else
- start = qMin(start, length);
-
- if (end < 0)
- end = qMax(length + end, 0);
- else
- end = qMin(end, length);
-
- int count = qMax(0, end - start);
- return (QScriptValueImpl(eng, text.mid(start, count)));
-}
-
-QScriptValueImpl String::method_split(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QScriptValueImpl l = context->argument(1);
- quint32 lim = l.isUndefined() ? UINT_MAX : QScriptEnginePrivate::toUint32(l.toNumber());
-
- if (lim == 0)
- return eng->newArray();
-
- QString S = context->thisObject().toString();
- QScriptValueImpl separator = context->argument(0);
-
- QScript::Array A(eng);
- // the argumentCount() check is for compatibility with spidermonkey;
- // it is not according to ECMA-262
- if (separator.isUndefined() && (context->argumentCount() == 0)) {
- A.assign(0, QScriptValueImpl(eng, S));
- } else {
- QStringList matches;
-#ifndef QT_NO_REGEXP
- if (Ecma::RegExp::Instance *rx = eng->regexpConstructor->get(separator)) {
- matches = S.split(rx->value, rx->value.pattern().isEmpty()
- ? QString::SkipEmptyParts : QString::KeepEmptyParts);
- } else
-#endif // QT_NO_REGEXP
- {
- QString sep = separator.toString();
- matches = S.split(sep, sep.isEmpty()
- ? QString::SkipEmptyParts : QString::KeepEmptyParts);
- }
- uint count = qMin(lim, uint(matches.count()));
- for (uint i = 0; i < count; ++i)
- A.assign(i, QScriptValueImpl(eng, matches.at(i)));
- }
-
- return eng->newArray(A);
-}
-
-QScriptValueImpl String::method_substr(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
-
- qsreal start = 0;
- if (context->argumentCount() > 0)
- start = context->argument(0).toInteger();
-
- qsreal length = +qInf();
- if (context->argumentCount() > 1)
- length = context->argument(1).toInteger();
-
- qsreal count = value.length();
- if (start < 0)
- start = qMax(count + start, 0.0);
-
- length = qMin(qMax(length, 0.0), count - start);
-
- qint32 x = QScriptEnginePrivate::toInt32(start);
- qint32 y = QScriptEnginePrivate::toInt32(length);
- return QScriptValueImpl(eng, value.mid(x, y));
-}
-
-QScriptValueImpl String::method_substring(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
- int length = value.length();
-
- qsreal start = 0;
- qsreal end = length;
-
- if (context->argumentCount() > 0)
- start = context->argument(0).toInteger();
-
- if (context->argumentCount() > 1)
- end = context->argument(1).toInteger();
-
- if (qIsNaN(start) || start < 0)
- start = 0;
-
- if (qIsNaN(end) || end < 0)
- end = 0;
-
- if (start > length)
- start = length;
-
- if (end > length)
- end = length;
-
- if (start > end) {
- qsreal was = start;
- start = end;
- end = was;
- }
-
- qint32 x = QScriptEnginePrivate::toInt32(start);
- qint32 y = QScriptEnginePrivate::toInt32(end - start);
-
- return (QScriptValueImpl(eng, value.mid(x, y)));
-}
-
-QScriptValueImpl String::method_toLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
- return (QScriptValueImpl(eng, value.toLower()));
-}
-
-QScriptValueImpl String::method_toLocaleLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- return method_toLowerCase(context, eng, classInfo); // ### check me
-}
-
-QScriptValueImpl String::method_toUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
- return (QScriptValueImpl(eng, value.toUpper()));
-}
-
-QScriptValueImpl String::method_toLocaleUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- return method_toUpperCase(context, eng, classInfo); // ### check me
-}
-
-QScriptValueImpl String::method_fromCharCode(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString str;
- for (int i = 0; i < context->argumentCount(); ++i) {
- QChar c(context->argument(i).toUInt16());
- str += c;
- }
- return (QScriptValueImpl(eng, str));
-}
-
-// Qt extensions
-
-QScriptValueImpl String::method_ext_arg(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- QString value = context->thisObject().toString();
- QScriptValueImpl arg = context->argument(0);
- QString result;
- if (arg.isString())
- result = value.arg(arg.toString());
- else if (arg.isNumber())
- result = value.arg(arg.toNumber());
- return QScriptValueImpl(eng, result);
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptecmastring_p.h b/src/script/qscriptecmastring_p.h
deleted file mode 100644
index 9ddd659..0000000
--- a/src/script/qscriptecmastring_p.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTECMASTRING_P_H
-#define QSCRIPTECMASTRING_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptecmacore_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ecma {
-
-class String: public Core
-{
-public:
- String(QScriptEnginePrivate *engine);
- virtual ~String();
-
- virtual void execute(QScriptContextPrivate *context);
-
- void newString(QScriptValueImpl *result, const QString &value = QString());
-
-protected:
- static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_charAt(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_charCodeAt(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_concat(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_indexOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_lastIndexOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_localeCompare(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_match(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_replace(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_search(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_slice(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_split(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_substr(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_substring(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLocaleLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toLocaleUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_fromCharCode(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-
-public:
- // Qt extensions
- static QScriptValueImpl method_ext_arg(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-};
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptengine_p.cpp b/src/script/qscriptengine_p.cpp
deleted file mode 100644
index 84a420d..0000000
--- a/src/script/qscriptengine_p.cpp
+++ /dev/null
@@ -1,2729 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptengine_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptlexer_p.h"
-#include "qscriptnodepool_p.h"
-#include "qscriptparser_p.h"
-#include "qscriptcompiler_p.h"
-#include "qscriptvalueiteratorimpl_p.h"
-#include "qscriptecmaglobal_p.h"
-#include "qscriptecmamath_p.h"
-#include "qscriptecmaarray_p.h"
-#include "qscriptextenumeration_p.h"
-#include "qscriptsyntaxchecker_p.h"
-#include "qscriptsyntaxcheckresult_p.h"
-#include "qscriptclass.h"
-#include "qscriptclass_p.h"
-#include "qscriptengineagent.h"
-
-#include <QtCore/QDate>
-#include <QtCore/QDateTime>
-#include <QtCore/QRegExp>
-#include <QtCore/QStringList>
-#include <QtCore/QVariant>
-
-#ifndef QT_NO_QOBJECT
-#include "qscriptextensioninterface.h"
-#include <QtCore/QDir>
-#include <QtCore/QFile>
-#include <QtCore/QFileInfo>
-#include <QtCore/QTextStream>
-#include <QtCore/QCoreApplication>
-#include <QtCore/QPluginLoader>
-#endif
-
-Q_DECLARE_METATYPE(QScriptValue)
-#ifndef QT_NO_QOBJECT
-Q_DECLARE_METATYPE(QObjectList)
-#endif
-Q_DECLARE_METATYPE(QList<int>)
-
-QT_BEGIN_NAMESPACE
-
-extern char *qdtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **digits_str);
-extern double qstrtod(const char *s00, char const **se, bool *ok);
-
-namespace QScript {
-
-QString numberToString(qsreal value)
-{
- if (qIsNaN(value))
- return QLatin1String("NaN");
-
- else if (qIsInf(value))
- return QLatin1String(value < 0 ? "-Infinity" : "Infinity");
-
- else if (value == 0)
- return QLatin1String("0");
-
- QByteArray buf;
- buf.reserve(80);
-
- int decpt;
- int sign;
- char *result = 0;
- (void) qdtoa(value, 0, 0, &decpt, &sign, 0, &result);
-
- if (! result)
- return QString();
-
- else if (decpt <= 0 && decpt > -6) {
-
- buf.fill('0', -decpt + 2 + sign);
-
- if (sign) // fix the sign.
- buf[0] = '-';
-
- buf[sign + 1] = '.';
- buf += result;
- }
-
- else {
- if (sign)
- buf += '-';
-
- buf += result;
- int length = buf.length() - sign;
-
- if (decpt <= 21 && decpt > 0) {
- if (length <= decpt)
- buf += QByteArray().fill('0', decpt - length);
- else
- buf.insert(decpt + sign, '.');
- }
-
- else if (result[0] >= '0' && result[0] <= '9') {
- if (length > 1)
- buf.insert(1 + sign, '.');
-
- buf += 'e';
- buf += (decpt >= 0) ? '+' : '-';
-
- int e = decpt - 1;
-
- if (e < 0)
- e = -e;
-
- if (e >= 100)
- buf += '0' + e / 100;
-
- if (e >= 10)
- buf += '0' + (e % 100) / 10;
-
- buf += '0' + e % 10;
- }
- }
-
- free(result);
-
- return QString::fromLatin1(buf);
-}
-
-static int toDigit(char c)
-{
- if ((c >= '0') && (c <= '9'))
- return c - '0';
- else if ((c >= 'a') && (c <= 'z'))
- return 10 + c - 'a';
- else if ((c >= 'A') && (c <= 'Z'))
- return 10 + c - 'A';
- return -1;
-}
-
-qsreal integerFromString(const char *buf, int size, int radix)
-{
- if (size == 0)
- return qSNaN();
-
- qsreal sign = 1.0;
- int i = 0;
- if (buf[0] == '+') {
- ++i;
- } else if (buf[0] == '-') {
- sign = -1.0;
- ++i;
- }
-
- if (((size-i) >= 2) && (buf[i] == '0')) {
- if (((buf[i+1] == 'x') || (buf[i+1] == 'X'))
- && (radix < 34)) {
- if ((radix != 0) && (radix != 16))
- return 0;
- radix = 16;
- i += 2;
- } else {
- if (radix == 0) {
- radix = 8;
- ++i;
- }
- }
- } else if (radix == 0) {
- radix = 10;
- }
-
- int j = i;
- for ( ; i < size; ++i) {
- int d = toDigit(buf[i]);
- if ((d == -1) || (d >= radix))
- break;
- }
- qsreal result;
- if (j == i) {
- if (!qstrcmp(buf, "Infinity"))
- result = qInf();
- else
- result = qSNaN();
- } else {
- result = 0;
- qsreal multiplier = 1;
- for (--i ; i >= j; --i, multiplier *= radix)
- result += toDigit(buf[i]) * multiplier;
- }
- result *= sign;
- return result;
-}
-
-qsreal integerFromString(const QString &str, int radix)
-{
- QByteArray ba = str.trimmed().toUtf8();
- return integerFromString(ba.constData(), ba.size(), radix);
-}
-
-qsreal numberFromString(const QString &repr)
-{
- QString str = repr.trimmed();
- if ((str.length() > 2) && (str.at(0) == QLatin1Char('0')) && (str.at(1).toUpper() == QLatin1Char('X')))
- return integerFromString(str.mid(2), 16);
- QByteArray latin1 = str.toLatin1();
- const char *data = latin1.constData();
- const char *eptr = 0;
- qsreal result = qstrtod(data, &eptr, 0);
- if (eptr == data) {
- if (str == QLatin1String("Infinity"))
- result = +qInf();
- else if (str == QLatin1String("+Infinity"))
- result = +qInf();
- else if (str == QLatin1String("-Infinity"))
- result = -qInf();
- else if (str.isEmpty())
- result = 0;
- else
- result = qSNaN();
- } else if (eptr != (data + latin1.length())) {
- result = qSNaN();
- }
- return result;
-}
-
-NodePool::NodePool(const QString &fileName, QScriptEnginePrivate *engine)
- : m_fileName(fileName), m_engine(engine)
-{
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- m_id = engine->nextScriptId();
-#endif
-}
-
-NodePool::~NodePool()
-{
- qDeleteAll(m_codeCache);
- m_codeCache.clear();
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- m_engine->notifyScriptUnload(id());
-#endif
-}
-
-Code *NodePool::createCompiledCode(AST::Node *node, CompilationUnit &compilation)
-{
- QHash<AST::Node*, Code*>::const_iterator it = m_codeCache.constFind(node);
- if (it != m_codeCache.constEnd())
- return it.value();
-
- Code *code = new Code();
- code->init(compilation, this);
-
- m_codeCache.insert(node, code);
- return code;
-}
-
-class EvalFunction : public QScriptFunction
-{
-public:
- EvalFunction(QScriptEnginePrivate *)
- { length = 1; }
-
- virtual ~EvalFunction() {}
-
- void evaluate(QScriptContextPrivate *context, const QString &contents,
- int lineNo, const QString &fileName, bool calledFromScript)
- {
- QScriptEnginePrivate *eng_p = context->engine();
-
- QExplicitlySharedDataPointer<NodePool> pool;
- pool = new NodePool(fileName, eng_p);
- eng_p->setNodePool(pool.data());
-
- QString errorMessage;
- int errorLineNumber;
- AST::Node *program = eng_p->createAbstractSyntaxTree(
- contents, lineNo, &errorMessage, &errorLineNumber);
-
- eng_p->setNodePool(0);
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyScriptLoad(pool->id(), contents, fileName, lineNo);
-#endif
-
- Code *code = 0;
- if (program) {
- Compiler compiler(eng_p);
- compiler.setTopLevelCompiler(true);
- CompilationUnit compilation = compiler.compile(program);
- if (!compilation.isValid()) {
- errorMessage = compilation.errorMessage();
- errorLineNumber = compilation.errorLineNumber();
- } else {
- code = pool->createCompiledCode(program, compilation);
- }
- }
-
- if (!code) {
- context->errorLineNumber = errorLineNumber;
- context->currentLine = errorLineNumber;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- Code *oldCode = context->m_code;
- Code dummy;
- dummy.astPool = pool.data();
- context->m_code = &dummy; // so agents get the script ID
- bool wasEvaluating = eng_p->m_evaluating;
- eng_p->m_evaluating = true;
- eng_p->notifyFunctionEntry(context);
-#endif
- context->throwError(QScriptContext::SyntaxError, errorMessage);
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionExit(context);
- eng_p->m_evaluating = wasEvaluating;
- context->m_code = oldCode;
-#endif
- return;
- }
-
- if (calledFromScript) {
- if (QScriptContextPrivate *pc = context->parentContext()) {
- context->setActivationObject(pc->activationObject());
- context->setThisObject(pc->thisObject());
- context->m_scopeChain = pc->m_scopeChain;
- }
- }
-
- const QScriptInstruction *iPtr = context->instructionPointer();
- context->execute(code);
- context->setInstructionPointer(iPtr);
- }
-
- virtual void execute(QScriptContextPrivate *context)
- {
- QScriptEnginePrivate *eng = context->engine();
- int lineNo = context->currentLine;
- if (lineNo == -1) {
- QScriptContextPrivate *pc = context->parentContext();
- if (pc)
- lineNo = pc->currentLine;
- else
- lineNo = 1;
- }
- QString fileName; // don't set this for now, we don't want to change the official eval() for now.
-
- if (context->argumentCount() == 0) {
- context->setReturnValue(eng->undefinedValue());
- } else {
- QScriptValueImpl arg = context->argument(0);
- if (arg.isString()) {
- QString contents = arg.toString();
- evaluate(context, contents, lineNo, fileName, /*calledFromScript=*/true);
- } else {
- context->setReturnValue(arg);
- }
- }
- }
-
- QString functionName() const
- {
- return QLatin1String("eval");
- }
-};
-
-class ArgumentsClassData: public QScriptClassData
-{
-
-public:
-
- static inline QScript::ArgumentsObjectData *get(const QScriptValueImpl &object)
- { return static_cast<QScript::ArgumentsObjectData*>(object.objectData()); }
-
- virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode access);
- virtual bool get(const QScriptValueImpl &object, const QScript::Member &member,
- QScriptValueImpl *out_value);
- virtual bool put(QScriptValueImpl *object, const QScript::Member &member,
- const QScriptValueImpl &value);
- virtual void mark(const QScriptValueImpl &object, int generation);
- virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object);
-};
-
-class ArgumentsClassDataIterator: public QScriptClassDataIterator
-{
-public:
- ArgumentsClassDataIterator(ArgumentsObjectData *data);
- virtual ~ArgumentsClassDataIterator();
-
- virtual bool hasNext() const;
- virtual void next(QScript::Member *member);
-
- virtual bool hasPrevious() const;
- virtual void previous(QScript::Member *member);
-
- virtual void toFront();
- virtual void toBack();
-
-private:
- ArgumentsObjectData *m_data;
- uint m_pos;
-};
-
-bool ArgumentsClassData::resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode /*access*/)
-{
- QString propertyName = object.engine()->toString(nameId);
- bool isNumber;
- quint32 index = propertyName.toUInt(&isNumber);
- if (isNumber) {
- QScript::ArgumentsObjectData *data = ArgumentsClassData::get(object);
- if (index < data->length) {
- member->native(/*nameId=*/0, index, QScriptValue::SkipInEnumeration);
- *base = object;
- return true;
- }
- }
-
- return false;
-}
-
-bool ArgumentsClassData::get(const QScriptValueImpl &object, const QScript::Member &member,
- QScriptValueImpl *out_value)
-{
- QScript::ArgumentsObjectData *data = ArgumentsClassData::get(object);
- if (member.nameId() == 0) {
- QScriptObject *activation_data = data->activation.objectValue();
- *out_value = activation_data->m_values[member.id()];
- return true;
- }
- return false;
-}
-
-bool ArgumentsClassData::put(QScriptValueImpl *object, const QScript::Member &member,
- const QScriptValueImpl &value)
-{
- Q_ASSERT(member.nameId() == 0);
- QScript::ArgumentsObjectData *data = ArgumentsClassData::get(*object);
- QScriptObject *activation_data = data->activation.objectValue();
- activation_data->m_values[member.id()] = value;
- return true;
-}
-
-void ArgumentsClassData::mark(const QScriptValueImpl &object, int generation)
-{
- QScript::ArgumentsObjectData *data = ArgumentsClassData::get(object);
- data->activation.mark(generation);
-}
-
-QScriptClassDataIterator *ArgumentsClassData::newIterator(const QScriptValueImpl &object)
-{
- QScript::ArgumentsObjectData *data = ArgumentsClassData::get(object);
- return new ArgumentsClassDataIterator(data);
-}
-
-ArgumentsClassDataIterator::ArgumentsClassDataIterator(ArgumentsObjectData *data)
- : m_data(data), m_pos(0)
-{
-}
-
-ArgumentsClassDataIterator::~ArgumentsClassDataIterator()
-{
-}
-
-bool ArgumentsClassDataIterator::hasNext() const
-{
- return m_pos < m_data->length;
-}
-
-void ArgumentsClassDataIterator::next(QScript::Member *member)
-{
- if (m_pos == m_data->length) {
- member->invalidate();
- } else {
- member->native(/*nameId=*/0, m_pos, QScriptValue::SkipInEnumeration);
- ++m_pos;
- }
-}
-
-bool ArgumentsClassDataIterator::hasPrevious() const
-{
- return (m_pos != 0);
-}
-
-void ArgumentsClassDataIterator::previous(QScript::Member *member)
-{
- if (m_pos == 0) {
- member->invalidate();
- } else {
- --m_pos;
- member->native(/*nameId=*/0, m_pos, QScriptValue::SkipInEnumeration);
- }
-}
-
-void ArgumentsClassDataIterator::toFront()
-{
- m_pos = 0;
-}
-
-void ArgumentsClassDataIterator::toBack()
-{
- m_pos = m_data->length;
-}
-
-} // namespace QScript
-
-const qsreal QScriptEnginePrivate::D16 = 65536.0;
-const qsreal QScriptEnginePrivate::D32 = 4294967296.0;
-
-QScriptEnginePrivate::~QScriptEnginePrivate()
-{
- while (!m_agents.isEmpty())
- delete m_agents.takeFirst();
-
- // invalidate values that we have references to
- {
- QHash<QScriptObject*, QScriptValuePrivate*>::const_iterator it;
- for (it = m_objectHandles.constBegin(); it != m_objectHandles.constEnd(); ++it)
- (*it)->invalidate();
- }
- {
- QHash<QScriptNameIdImpl*, QScriptValuePrivate*>::const_iterator it;
- for (it = m_stringHandles.constBegin(); it != m_stringHandles.constEnd(); ++it)
- (*it)->invalidate();
- }
- {
- QVector<QScriptValuePrivate*>::const_iterator it;
- for (it = m_otherHandles.constBegin(); it != m_otherHandles.constEnd(); ++it)
- (*it)->invalidate();
- }
-
- // invalidate interned strings that are known to the outside world
- {
- QHash<QScriptNameIdImpl*, QScriptStringPrivate*>::const_iterator it;
- for (it = m_internedStrings.constBegin(); it != m_internedStrings.constEnd(); ++it)
- it.value()->nameId = 0;
- }
-
- delete[] m_string_hash_base;
- qDeleteAll(m_stringRepository);
- qDeleteAll(m_tempStringRepository);
-
- if (tempStackBegin)
- delete[] tempStackBegin;
-
-#ifndef QT_NO_QOBJECT
- deletePendingQObjects();
- qDeleteAll(m_qobjectData);
-# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- qDeleteAll(m_cachedMetaObjects);
-# endif
-#endif
-
- qDeleteAll(m_allocated_classes);
-}
-
-QScript::AST::Node *QScriptEnginePrivate::changeAbstractSyntaxTree(QScript::AST::Node *prg)
-{
- QScript::AST::Node *was = m_abstractSyntaxTree;
- m_abstractSyntaxTree = prg;
- return was;
-}
-
-QScript::AST::Node *QScriptEnginePrivate::createAbstractSyntaxTree(
- const QString &source, int lineNumber, QString *errorMessage, int *errorLineNumber)
-{
- QScript::Lexer lex(this);
- setLexer(&lex);
- lex.setCode(source, lineNumber);
-
- QScriptParser parser;
-
- if (! parser.parse(this)) {
- if (errorMessage)
- *errorMessage = parser.errorMessage();
- if (errorLineNumber)
- *errorLineNumber = parser.errorLineNumber();
- return 0;
- }
-
- return abstractSyntaxTree();
-}
-
-void QScriptEnginePrivate::markObject(const QScriptValueImpl &object, int generation)
-{
- QScriptObject *instance = object.objectValue();
- QScript::GCBlock *block = QScript::GCBlock::get(instance);
-
- enum { MAX_GC_DEPTH = 32 };
-
- if (block->generation + 1 != generation)
- return;
-
- if (m_gc_depth >= MAX_GC_DEPTH) {
- // do the marking later
- m_markStack.append(object);
- return;
- }
-
- ++block->generation;
- ++m_gc_depth;
-
- if (QScriptClassData *data = object.classInfo()->data())
- data->mark(object, generation);
-
- if (instance->m_prototype.isObject())
- markObject(instance->m_prototype, generation);
-
- if (instance->m_scope.isObject())
- markObject(instance->m_scope, generation);
-
- const QScriptValueImpl &internalValue = instance->m_internalValue;
-
- if (internalValue.isValid()) {
- if (internalValue.isObject())
- markObject(internalValue, generation);
-
- else if (internalValue.isString())
- markString(internalValue.m_string_value, generation);
- }
-
- int garbage = 0;
-
- for (int i = 0; i < instance->memberCount(); ++i) {
- QScript::Member m;
- instance->member(i, &m);
-
- if (! m.isValid()) {
- ++garbage;
- continue;
- }
-
- Q_ASSERT(m.isObjectProperty());
-
- QScriptValueImpl child;
- instance->get(m, &child);
-
- if (m.nameId())
- markString(m.nameId(), generation);
-
- if (! child.isValid())
- continue;
-
- else if (child.isObject())
- markObject(child, generation);
-
- else if (child.isString())
- markString(child.m_string_value, generation);
- }
-
- --m_gc_depth;
-
- if (garbage < 128) // ###
- return;
-
- int j = 0;
- for (int i = 0; i < instance->memberCount(); ++i) {
- QScript::Member m;
- instance->member(i, &m);
-
- if (! m.isValid())
- continue;
-
- if (i != j) {
- instance->m_members[j].object(m.nameId(), j, m.flags());
- instance->m_values[j] = instance->m_values[i];
- }
- ++j;
- }
- //qDebug() << "==> old:" << instance->m_members.size() << "new:" << j;
- instance->m_members.resize(j);
- instance->m_values.resize(j);
-}
-
-void QScriptEnginePrivate::markFrame(QScriptContextPrivate *context, int generation)
-{
- QScriptValueImpl activation = context->activationObject();
- QScriptValueImpl thisObject = context->thisObject();
- QScriptValueImpl scopeChain = context->m_scopeChain;
- QScriptValueImpl callee = context->m_callee;
- QScriptValueImpl arguments = context->m_arguments;
-
- if (activation.isObject())
- markObject(activation, generation);
-
- if (scopeChain.isObject())
- markObject(scopeChain, generation);
-
- if (thisObject.isObject())
- markObject(thisObject, generation);
-
- if (callee.isObject())
- markObject(callee, generation);
-
- if (arguments.isObject())
- markObject(arguments, generation);
-
- if (context->returnValue().isValid()) {
- if (context->returnValue().isObject())
- markObject(context->returnValue(), generation);
-
- else if (context->returnValue().isString())
- markString(context->returnValue().m_string_value, generation);
- }
-
- if (context->baseStackPointer() != context->currentStackPointer()) {
- // mark the temp stack
-
- for (const QScriptValueImpl *it = context->baseStackPointer(); it != (context->currentStackPointer() + 1); ++it) {
- if (! it) {
- qWarning() << "no temp stack!!!";
- break;
- }
-
- else if (! it->isValid()) // ### assert?
- continue;
-
- else if (it->isObject())
- markObject(*it, generation);
-
- else if (it->isString())
- markString(it->m_string_value, generation);
- }
- }
-}
-
-bool QScriptEnginePrivate::isCollecting() const
-{
- return (m_gc_depth != -1) || objectAllocator.sweeping();
-}
-
-void QScriptEnginePrivate::maybeGC_helper(bool do_string_gc)
-{
- // qDebug() << "==>" << objectAllocator.newAllocatedBlocks() << "free:" << objectAllocator.freeBlocks();
- Q_ASSERT(m_gc_depth == -1);
- ++m_gc_depth;
-
- int generation = m_objectGeneration + 1;
-
- markObject(m_globalObject, generation);
-
- objectConstructor->mark(this, generation);
- numberConstructor->mark(this, generation);
- booleanConstructor->mark(this, generation);
- stringConstructor->mark(this, generation);
- dateConstructor->mark(this, generation);
- functionConstructor->mark(this, generation);
- arrayConstructor->mark(this, generation);
- regexpConstructor->mark(this, generation);
- errorConstructor->mark(this, generation);
- enumerationConstructor->mark(this, generation);
- variantConstructor->mark(this, generation);
-#ifndef QT_NO_QOBJECT
- qobjectConstructor->mark(this, generation);
- qmetaObjectConstructor->mark(this, generation);
-#endif
-
- {
- QScriptContextPrivate *current = currentContext();
- while (current != 0) {
- markFrame (current, generation);
- current = current->parentContext();
- }
- }
-
- {
- QHash<QScriptObject*, QScriptValuePrivate*>::const_iterator it;
- for (it = m_objectHandles.constBegin(); it != m_objectHandles.constEnd(); ++it)
- markObject((*it)->value, generation);
- }
-
- {
- QHash<QScriptNameIdImpl*, QScriptValuePrivate*>::const_iterator it;
- for (it = m_stringHandles.constBegin(); it != m_stringHandles.constEnd(); ++it)
- markString((*it)->value.stringValue(), generation);
- }
-
- {
- QHash<int, QScriptCustomTypeInfo>::const_iterator it;
- for (it = m_customTypes.constBegin(); it != m_customTypes.constEnd(); ++it)
- (*it).prototype.mark(generation);
- }
-
-#ifndef QT_NO_QOBJECT
-# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- {
- QHash<const QMetaObject*, QScriptMetaObject*>::const_iterator it;
- for (it = m_cachedMetaObjects.constBegin(); it != m_cachedMetaObjects.constEnd(); ++it) {
- {
- QList<QScriptNameIdImpl*> memberNames = (*it)->registeredMemberNames();
- QList<QScriptNameIdImpl*>::const_iterator it2;
- for (it2 = memberNames.constBegin(); it2 != memberNames.constEnd(); ++it2)
- markString(*it2, generation);
- }
- {
- QList<QScriptValueImpl> propertyAccessors = (*it)->registeredPropertyAccessors();
- QList<QScriptValueImpl>::const_iterator it2;
- for (it2 = propertyAccessors.constBegin(); it2 != propertyAccessors.constEnd(); ++it2)
- markObject(*it2, generation);
- }
- }
- }
-# endif
- processMarkStack(generation); // make sure everything is marked before marking qobject data
- {
- QHash<QObject*, QScriptQObjectData*>::const_iterator it;
- for (it = m_qobjectData.constBegin(); it != m_qobjectData.constEnd(); ++it) {
- QScriptQObjectData *qdata = it.value();
- qdata->mark(generation);
- }
- }
-#endif
- processMarkStack(generation);
-
- Q_ASSERT(m_gc_depth == 0);
- --m_gc_depth;
-
- objectAllocator.sweep(generation);
-
- m_objectGeneration = generation;
-
- //qDebug() << "free blocks:" << objectAllocator.freeBlocks();
-
-#ifndef QT_NO_QOBJECT
- deletePendingQObjects();
-#endif
-
- if (! do_string_gc)
- return;
-
- {
- QHash<QScriptNameIdImpl*, QScriptStringPrivate*>::const_iterator it;
- for (it = m_internedStrings.constBegin(); it != m_internedStrings.constEnd(); ++it) {
- it.value()->nameId->used = true;
- }
- }
-
-#if 0
- qDebug() << "do_string_gc:" << do_string_gc
- << ((m_stringRepository.size() - m_oldStringRepositorySize) > 256)
- << ((m_tempStringRepository.size() - m_oldTempStringRepositorySize) > 2048);
-#endif
-
- QVector<QScriptNameIdImpl*> compressed;
- compressed.reserve(m_stringRepository.size());
-
- for (int i = 0; i < m_stringRepository.size(); ++i) {
- QScriptNameIdImpl *entry = m_stringRepository.at(i);
-
- if (entry->used || entry->persistent) {
- compressed.append(entry);
- entry->used = false;
- }
-
- else {
- //qDebug() << "deleted unique:" << entry->s;
- delete entry;
- }
- }
-
- // qDebug() << "before:" << m_stringRepository.size() << "after:" << compressed.size() << globalObject.objectValue()->m_members.size();
- m_stringRepository = compressed;
- rehashStringRepository(/*resize=*/ false);
- m_oldStringRepositorySize = m_stringRepository.size();
- m_newAllocatedStringRepositoryChars = 0;
-
- compressed.clear();
- for (int i = 0; i < m_tempStringRepository.size(); ++i) {
- QScriptNameIdImpl *entry = m_tempStringRepository.at(i);
-
- if (entry->used || entry->persistent) {
- compressed.append(entry);
- entry->used = false;
- }
-
- else {
- //qDebug() << "deleted:" << entry->s;
- delete entry;
- }
- }
-
- //qDebug() << "before:" << m_tempStringRepository.size() << "after:" << compressed.size();
-
- m_tempStringRepository = compressed;
- m_oldTempStringRepositorySize = m_tempStringRepository.size();
- m_newAllocatedTempStringRepositoryChars = 0;
-}
-
-void QScriptEnginePrivate::processMarkStack(int generation)
-{
- // mark the objects we couldn't process due to recursion depth
- while (!m_markStack.isEmpty())
- markObject(m_markStack.takeLast(), generation);
-}
-
-void QScriptEnginePrivate::evaluate(QScriptContextPrivate *context, const QString &contents, int lineNumber, const QString &fileName)
-{
- // ### try to remove cast
- QScript::EvalFunction *evalFunction = static_cast<QScript::EvalFunction*>(m_evalFunction);
- evalFunction->evaluate(context, contents, lineNumber, fileName, /*calledFromScript=*/ false);
-}
-
-qsreal QScriptEnginePrivate::convertToNativeDouble_helper(const QScriptValueImpl &value)
-{
- switch (value.type()) {
- case QScript::InvalidType:
- Q_ASSERT(value.isValid());
- break;
-
- case QScript::UndefinedType:
- case QScript::PointerType:
- break;
-
- case QScript::NullType:
- return 0;
-
- case QScript::BooleanType:
- return value.m_bool_value;
-
- case QScript::IntegerType:
- case QScript::ReferenceType:
- return value.m_int_value;
-
- case QScript::NumberType:
- return value.m_number_value;
-
- case QScript::StringType:
- return QScript::numberFromString(toString(value.m_string_value));
-
- case QScript::ObjectType: {
- QScriptValueImpl p = value.engine()->toPrimitive(value, QScriptValueImpl::NumberTypeHint);
- if (! p.isValid() || p.isObject())
- break;
-
- return convertToNativeDouble(p);
- }
-
- case QScript::LazyStringType:
- return QScript::numberFromString(*value.m_lazy_string_value);
-
- } // switch
-
- return qSNaN();
-}
-
-bool QScriptEnginePrivate::convertToNativeBoolean_helper(const QScriptValueImpl &value)
-{
- switch (value.type()) {
- case QScript::InvalidType:
- Q_ASSERT(value.isValid());
- return false;
-
- case QScript::UndefinedType:
- case QScript::PointerType:
- case QScript::NullType:
- case QScript::ReferenceType:
- return false;
-
- case QScript::BooleanType:
- return value.m_bool_value;
-
- case QScript::IntegerType:
- return value.m_int_value != 0;
-
- case QScript::NumberType:
- return value.m_number_value != 0 && !qIsNaN(value.m_number_value);
-
- case QScript::StringType:
- return toString(value.m_string_value).length() != 0;
-
- case QScript::ObjectType:
- return true;
-
- case QScript::LazyStringType:
- return value.m_lazy_string_value->length() != 0;
-
- } // switch
-
- return false;
-}
-
-QString QScriptEnginePrivate::convertToNativeString_helper(const QScriptValueImpl &value)
-{
- static QStringList predefined;
- if (predefined.isEmpty()) {
- predefined.append(QString::fromLatin1("undefined"));
- predefined.append(QString::fromLatin1("null"));
- predefined.append(QString::fromLatin1("true"));
- predefined.append(QString::fromLatin1("false"));
- predefined.append(QString::fromLatin1("pointer"));
- }
-
- switch (value.type()) {
- case QScript::InvalidType:
- Q_ASSERT(value.isValid());
- return QString();
-
- case QScript::UndefinedType:
- return predefined.at(0);
-
- case QScript::NullType:
- return predefined.at(1);
-
- case QScript::BooleanType:
- return value.m_bool_value ? predefined.at(2) : predefined.at(3);
-
- case QScript::IntegerType:
- return QString::number(value.m_int_value);
-
- case QScript::NumberType:
- return QScript::numberToString(value.m_number_value);
-
- case QScript::PointerType:
- return predefined.at(4);
-
- case QScript::StringType:
- return toString(value.m_string_value);
-
- case QScript::ReferenceType:
- return QString();
-
- case QScript::ObjectType: {
- QScriptValueImpl p = value.engine()->toPrimitive(value, QScriptValueImpl::StringTypeHint);
-
- if (!p.isValid() || strictlyEquals(p, value))
- return p.classInfo()->name();
-
- return convertToNativeString(p);
- }
-
- case QScript::LazyStringType:
- return *value.m_lazy_string_value;
-
- } // switch
-
- return QString();
-}
-
-QScriptValueImpl QScriptEnginePrivate::toObject_helper(const QScriptValueImpl &value)
-{
- QScriptValueImpl result;
- switch (value.type()) {
- case QScript::BooleanType:
- booleanConstructor->newBoolean(&result, value.m_bool_value);
- break;
-
- case QScript::NumberType:
- numberConstructor->newNumber(&result, value.m_number_value);
- break;
-
- case QScript::StringType:
- stringConstructor->newString(&result, value.m_string_value->s);
- break;
-
- case QScript::LazyStringType:
- stringConstructor->newString(&result, *value.m_lazy_string_value);
- break;
-
- case QScript::InvalidType:
- case QScript::UndefinedType:
- case QScript::NullType:
- case QScript::IntegerType:
- case QScript::ReferenceType:
- case QScript::PointerType:
- case QScript::ObjectType:
- break;
- } // switch
-
- return result;
-}
-
-// [[defaultValue]]
-QScriptValueImpl QScriptEnginePrivate::toPrimitive_helper(const QScriptValueImpl &object,
- QScriptValueImpl::TypeHint hint)
-{
- QScriptNameIdImpl *functionIds[2];
-
- if ((hint == QScriptValueImpl::NumberTypeHint)
- || (hint == QScriptValueImpl::NoTypeHint
- && object.classInfo() != dateConstructor->classInfo())) {
- functionIds[0] = idTable()->id_valueOf;
- functionIds[1] = idTable()->id_toString;
- } else {
- functionIds[0] = idTable()->id_toString;
- functionIds[1] = idTable()->id_valueOf;
- }
-
- for (int i = 0; i < 2; ++i) {
- QScriptValueImpl base;
- QScript::Member member;
-
- if (! object.resolve(functionIds[i], &member, &base, QScriptValue::ResolvePrototype, QScript::Read))
- return object;
-
- QScriptValueImpl f_valueOf;
- base.get(member, &f_valueOf);
-
- if (QScriptFunction *foo = convertToNativeFunction(f_valueOf)) {
- QScriptContextPrivate *me = pushContext();
- QScriptValueImpl activation;
- newActivation(&activation);
- if (f_valueOf.scope().isValid())
- activation.setScope(f_valueOf.scope());
- else
- activation.setScope(m_globalObject);
- me->setActivationObject(activation);
- me->setThisObject(object);
- me->m_callee = f_valueOf;
- foo->execute(me);
- QScriptValueImpl result = me->returnValue();
- bool exception = (me->state() == QScriptContext::ExceptionState);
- popContext();
- if (exception || (result.isValid() && !result.isObject()))
- return result;
- }
- }
-
- return object;
-}
-
-void QScriptEnginePrivate::rehashStringRepository(bool resize)
-{
- if (resize) {
- delete[] m_string_hash_base;
- m_string_hash_size <<= 1; // ### use primes
-
- m_string_hash_base = new QScriptNameIdImpl* [m_string_hash_size];
- }
-
- memset(m_string_hash_base, 0, sizeof(QScriptNameIdImpl*) * m_string_hash_size);
-
- for (int index = 0; index < m_stringRepository.size(); ++index) {
- QScriptNameIdImpl *entry = m_stringRepository.at(index);
- uint h = _q_scriptHash(entry->s) % m_string_hash_size;
- entry->h = h;
- entry->next = m_string_hash_base[h];
- m_string_hash_base[h] = entry;
- }
-}
-
-QScriptNameIdImpl *QScriptEnginePrivate::insertStringEntry(const QString &s)
-{
- QScriptNameIdImpl *entry = new QScriptNameIdImpl(s);
- entry->unique = true;
- m_stringRepository.append(entry);
- m_newAllocatedStringRepositoryChars += s.length();
-
- uint h = _q_scriptHash(s) % m_string_hash_size;
- entry->h = h;
- entry->next = m_string_hash_base[h];
- m_string_hash_base[h] = entry;
-
- if (m_stringRepository.count() == m_string_hash_size)
- rehashStringRepository();
-
- return entry;
-}
-
-QScriptValueImpl QScriptEnginePrivate::call(const QScriptValueImpl &callee,
- const QScriptValueImpl &thisObject,
- const QScriptValueImplList &args,
- bool asConstructor)
-{
- QScriptFunction *function = callee.toFunction();
- Q_ASSERT(function);
-
- if (++m_callDepth == m_maxCallDepth) {
- QScriptContextPrivate *ctx_p = currentContext();
- return ctx_p->throwError(QLatin1String("call stack overflow"));
- }
-
- QScriptContextPrivate *nested = pushContext();
- // set up the temp stack
- if (! nested->tempStack)
- nested->stackPtr = nested->tempStack = tempStackBegin;
-
- newActivation(&nested->m_activation);
- if (callee.m_object_value->m_scope.isValid())
- nested->m_activation.m_object_value->m_scope = callee.m_object_value->m_scope;
- else
- nested->m_activation.m_object_value->m_scope = m_globalObject;
-
- QScriptObject *activation_data = nested->m_activation.m_object_value;
-
- int formalCount = function->formals.count();
- int argc = args.count();
- int mx = qMax(formalCount, argc);
- activation_data->m_members.resize(mx);
- activation_data->m_values.resize(mx);
- for (int i = 0; i < mx; ++i) {
- QScriptNameIdImpl *nameId = 0;
- if (i < formalCount)
- nameId = function->formals.at(i);
-
- activation_data->m_members[i].object(nameId, i, QScriptValue::SkipInEnumeration);
- QScriptValueImpl arg = (i < argc) ? args.at(i) : m_undefinedValue;
- if (arg.isValid() && arg.engine() && (arg.engine() != this)) {
- qWarning("QScriptValue::call() failed: "
- "cannot call function with argument created in "
- "a different engine");
- popContext();
- return QScriptValueImpl();
- }
- activation_data->m_values[i] = arg.isValid() ? arg : m_undefinedValue;
- }
-
- nested->argc = argc;
- QVector<QScriptValueImpl> argsv = args.toVector();
- nested->args = const_cast<QScriptValueImpl*> (argsv.constData());
-
- if (thisObject.isObject())
- nested->m_thisObject = thisObject;
- else
- nested->m_thisObject = m_globalObject;
- nested->m_callee = callee;
- nested->m_calledAsConstructor = asConstructor;
-
- nested->m_result = m_undefinedValue;
- function->execute(nested);
- --m_callDepth;
- QScriptValueImpl result = nested->m_result;
- nested->args = 0;
- popContext();
-
- return result;
-}
-
-QScriptValueImpl QScriptEnginePrivate::call(const QScriptValueImpl &callee,
- const QScriptValueImpl &thisObject,
- const QScriptValueImpl &args,
- bool asConstructor)
-{
- QScriptValueImplList argsList;
- if (QScript::Ecma::Array::Instance *arr = arrayConstructor->get(args)) {
- QScript::Array actuals = arr->value;
- for (quint32 i = 0; i < actuals.count(); ++i) {
- QScriptValueImpl a = actuals.at(i);
- if (! a.isValid())
- argsList << undefinedValue();
- else
- argsList << a;
- }
- } else if (args.classInfo() == m_class_arguments) {
- QScript::ArgumentsObjectData *arguments;
- arguments = static_cast<QScript::ArgumentsObjectData*> (args.objectData());
- QScriptObject *activation = arguments->activation.objectValue();
- for (uint i = 0; i < arguments->length; ++i)
- argsList << activation->m_values[i];
- } else if (!(args.isUndefined() || args.isNull())) {
- return currentContext()->throwError(
- QScriptContext::TypeError,
- QLatin1String("QScriptValue::call(): arguments must be an array"));
- }
- return call(callee, thisObject, argsList, asConstructor);
-}
-
-QScriptValueImpl QScriptEnginePrivate::arrayFromStringList(const QStringList &lst)
-{
- QScriptValueImpl arr = newArray(lst.size());
- for (int i = 0; i < lst.size(); ++i)
- arr.setProperty(i, QScriptValueImpl(this, lst.at(i)));
- return arr;
-}
-
-QStringList QScriptEnginePrivate::stringListFromArray(const QScriptValueImpl &arr)
-{
- QStringList lst;
- uint len = arr.property(QLatin1String("length")).toUInt32();
- for (uint i = 0; i < len; ++i)
- lst.append(arr.property(i).toString());
- return lst;
-}
-
-QScriptValueImpl QScriptEnginePrivate::arrayFromVariantList(const QVariantList &lst)
-{
- QScriptValueImpl arr = newArray(lst.size());
- for (int i = 0; i < lst.size(); ++i)
- arr.setProperty(i, valueFromVariant(lst.at(i)));
- return arr;
-}
-
-QVariantList QScriptEnginePrivate::variantListFromArray(const QScriptValueImpl &arr)
-{
- QVariantList lst;
- uint len = arr.property(QLatin1String("length")).toUInt32();
- for (uint i = 0; i < len; ++i)
- lst.append(arr.property(i).toVariant());
- return lst;
-}
-
-QScriptValueImpl QScriptEnginePrivate::objectFromVariantMap(const QVariantMap &vmap)
-{
- QScriptValueImpl obj = newObject();
- QVariantMap::const_iterator it;
- for (it = vmap.constBegin(); it != vmap.constEnd(); ++it)
- obj.setProperty(it.key(), valueFromVariant(it.value()));
- return obj;
-}
-
-QVariantMap QScriptEnginePrivate::variantMapFromObject(const QScriptValueImpl &obj)
-{
- QVariantMap vmap;
- QScriptValueIteratorImpl it(obj);
- while (it.hasNext()) {
- it.next();
- vmap.insert(it.name(), it.value().toVariant());
- }
- return vmap;
-}
-
-QScriptValueImpl QScriptEnginePrivate::create(int type, const void *ptr)
-{
- Q_Q(QScriptEngine);
- Q_ASSERT(ptr);
- QScriptValueImpl result;
- QScriptCustomTypeInfo info = m_customTypes.value(type);
- if (info.marshal) {
- result = toImpl(info.marshal(q, ptr));
- } else {
- // check if it's one of the types we know
- switch (QMetaType::Type(type)) {
- case QMetaType::Void:
- result = m_undefinedValue;
- break;
- case QMetaType::Bool:
- result = QScriptValueImpl(*reinterpret_cast<const bool*>(ptr));
- break;
- case QMetaType::Int:
- result = QScriptValueImpl(*reinterpret_cast<const int*>(ptr));
- break;
- case QMetaType::UInt:
- result = QScriptValueImpl(*reinterpret_cast<const uint*>(ptr));
- break;
- case QMetaType::LongLong:
- result = QScriptValueImpl(qsreal(*reinterpret_cast<const qlonglong*>(ptr)));
- break;
- case QMetaType::ULongLong:
-#if defined(Q_OS_WIN) && defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 12008804
-#pragma message("** NOTE: You need the Visual Studio Processor Pack to compile support for 64bit unsigned integers.")
- result = QScriptValueImpl(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));
-#elif defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET)
- result = QScriptValueImpl(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr)));
-#else
- result = QScriptValueImpl(qsreal(*reinterpret_cast<const qulonglong*>(ptr)));
-#endif
- break;
- case QMetaType::Double:
- result = QScriptValueImpl(*reinterpret_cast<const double*>(ptr));
- break;
- case QMetaType::QString:
- result = QScriptValueImpl(this, *reinterpret_cast<const QString*>(ptr));
- break;
- case QMetaType::Float:
- result = QScriptValueImpl(*reinterpret_cast<const float*>(ptr));
- break;
- case QMetaType::Short:
- result = QScriptValueImpl(*reinterpret_cast<const short*>(ptr));
- break;
- case QMetaType::UShort:
- result = QScriptValueImpl(*reinterpret_cast<const unsigned short*>(ptr));
- break;
- case QMetaType::Char:
- result = QScriptValueImpl(*reinterpret_cast<const char*>(ptr));
- break;
- case QMetaType::UChar:
- result = QScriptValueImpl(*reinterpret_cast<const unsigned char*>(ptr));
- break;
- case QMetaType::QChar:
- result = QScriptValueImpl((*reinterpret_cast<const QChar*>(ptr)).unicode());
- break;
- case QMetaType::QStringList:
- result = arrayFromStringList(*reinterpret_cast<const QStringList *>(ptr));
- break;
- case QMetaType::QVariantList:
- result = arrayFromVariantList(*reinterpret_cast<const QVariantList *>(ptr));
- break;
- case QMetaType::QVariantMap:
- result = objectFromVariantMap(*reinterpret_cast<const QVariantMap *>(ptr));
- break;
- case QMetaType::QDateTime: {
- QDateTime dateTime = *reinterpret_cast<const QDateTime *>(ptr);
- dateConstructor->newDate(&result, dateTime);
- } break;
- case QMetaType::QDate: {
- QDate date = *reinterpret_cast<const QDate *>(ptr);
- dateConstructor->newDate(&result, date);
- } break;
-#ifndef QT_NO_REGEXP
- case QMetaType::QRegExp: {
- QRegExp rx = *reinterpret_cast<const QRegExp *>(ptr);
- regexpConstructor->newRegExp(&result, rx);
- } break;
-#endif
-#ifndef QT_NO_QOBJECT
- case QMetaType::QObjectStar:
- case QMetaType::QWidgetStar:
- newQObject(&result, *reinterpret_cast<QObject* const *>(ptr));
- break;
-#endif
- default:
- if (type == qMetaTypeId<QScriptValue>()) {
- result = toImpl(*reinterpret_cast<const QScriptValue*>(ptr));
- if (!result.isValid())
- result = m_undefinedValue;
- }
-
-#ifndef QT_NO_QOBJECT
- // lazy registration of some common list types
- else if (type == qMetaTypeId<QObjectList>()) {
- qScriptRegisterSequenceMetaType<QObjectList>(q);
- return create(type, ptr);
- }
-#endif
- else if (type == qMetaTypeId<QList<int> >()) {
- qScriptRegisterSequenceMetaType<QList<int> >(q);
- return create(type, ptr);
- }
-
- else {
- QByteArray typeName = QMetaType::typeName(type);
- if (typeName == "QVariant")
- result = valueFromVariant(*reinterpret_cast<const QVariant*>(ptr));
- else if (typeName.endsWith('*') && !*reinterpret_cast<void* const *>(ptr))
- result = nullValue();
- else
- newVariant(&result, QVariant(type, ptr));
- }
- }
- }
- if (result.isObject() && info.prototype.isValid()
- && strictlyEquals(result.prototype(), objectConstructor->publicPrototype)) {
- result.setPrototype(info.prototype);
- }
- return result;
-}
-
-bool QScriptEnginePrivate::convert(const QScriptValueImpl &value,
- int type, void *ptr,
- QScriptEnginePrivate *eng)
-{
- if (!eng)
- eng = value.engine();
- if (eng) {
- QScriptCustomTypeInfo info = eng->m_customTypes.value(type);
- if (info.demarshal) {
- info.demarshal(eng->toPublic(value), ptr);
- return true;
- }
- }
-
- // check if it's one of the types we know
- switch (QMetaType::Type(type)) {
- case QMetaType::Bool:
- *reinterpret_cast<bool*>(ptr) = value.toBoolean();
- return true;
- case QMetaType::Int:
- *reinterpret_cast<int*>(ptr) = value.toInt32();
- return true;
- case QMetaType::UInt:
- *reinterpret_cast<uint*>(ptr) = value.toUInt32();
- return true;
- case QMetaType::LongLong:
- *reinterpret_cast<qlonglong*>(ptr) = qlonglong(value.toInteger());
- return true;
- case QMetaType::ULongLong:
- *reinterpret_cast<qulonglong*>(ptr) = qulonglong(value.toInteger());
- return true;
- case QMetaType::Double:
- *reinterpret_cast<double*>(ptr) = value.toNumber();
- return true;
- case QMetaType::QString:
- if (value.isUndefined() || value.isNull())
- *reinterpret_cast<QString*>(ptr) = QString();
- else
- *reinterpret_cast<QString*>(ptr) = value.toString();
- return true;
- case QMetaType::Float:
- *reinterpret_cast<float*>(ptr) = value.toNumber();
- return true;
- case QMetaType::Short:
- *reinterpret_cast<short*>(ptr) = short(value.toInt32());
- return true;
- case QMetaType::UShort:
- *reinterpret_cast<unsigned short*>(ptr) = value.toUInt16();
- return true;
- case QMetaType::Char:
- *reinterpret_cast<char*>(ptr) = char(value.toInt32());
- return true;
- case QMetaType::UChar:
- *reinterpret_cast<unsigned char*>(ptr) = (unsigned char)(value.toInt32());
- return true;
- case QMetaType::QChar:
- if (value.isString()) {
- QString str = value.toString();
- *reinterpret_cast<QChar*>(ptr) = str.isEmpty() ? QChar() : str.at(0);
- } else {
- *reinterpret_cast<QChar*>(ptr) = QChar(value.toUInt16());
- }
- return true;
- case QMetaType::QDateTime:
- if (value.isDate()) {
- *reinterpret_cast<QDateTime *>(ptr) = value.toDateTime();
- return true;
- } break;
- case QMetaType::QDate:
- if (value.isDate()) {
- *reinterpret_cast<QDate *>(ptr) = value.toDateTime().date();
- return true;
- } break;
-#ifndef QT_NO_REGEXP
- case QMetaType::QRegExp:
- if (value.isRegExp()) {
- *reinterpret_cast<QRegExp *>(ptr) = value.toRegExp();
- return true;
- } break;
-#endif
-#ifndef QT_NO_QOBJECT
- case QMetaType::QObjectStar:
- if (value.isQObject() || value.isNull()) {
- *reinterpret_cast<QObject* *>(ptr) = value.toQObject();
- return true;
- } break;
- case QMetaType::QWidgetStar:
- if (value.isQObject() || value.isNull()) {
- QObject *qo = value.toQObject();
- if (!qo || qo->isWidgetType()) {
- *reinterpret_cast<QWidget* *>(ptr) = reinterpret_cast<QWidget*>(qo);
- return true;
- }
- } break;
-#endif
- case QMetaType::QStringList:
- if (value.isArray()) {
- *reinterpret_cast<QStringList *>(ptr) = stringListFromArray(value);
- return true;
- } break;
- case QMetaType::QVariantList:
- if (value.isArray()) {
- *reinterpret_cast<QVariantList *>(ptr) = variantListFromArray(value);
- return true;
- } break;
- case QMetaType::QVariantMap:
- if (value.isObject()) {
- *reinterpret_cast<QVariantMap *>(ptr) = variantMapFromObject(value);
- return true;
- } break;
- default:
- ;
- }
-
- QByteArray name = QMetaType::typeName(type);
-#ifndef QT_NO_QOBJECT
- if (convertToNativeQObject(value, name, reinterpret_cast<void* *>(ptr)))
- return true;
-#endif
- if (value.isVariant() && name.endsWith('*')) {
- int valueType = QMetaType::type(name.left(name.size()-1));
- QVariant &var = value.variantValue();
- if (valueType == var.userType()) {
- *reinterpret_cast<void* *>(ptr) = var.data();
- return true;
- } else {
- // look in the prototype chain
- QScriptValueImpl proto = value.prototype();
- while (proto.isObject()) {
- bool canCast = false;
- if (proto.isVariant()) {
- canCast = (type == proto.variantValue().userType())
- || (valueType && (valueType == proto.variantValue().userType()));
- }
-#ifndef QT_NO_QOBJECT
- else if (proto.isQObject()) {
- QByteArray className = name.left(name.size()-1);
- if (QObject *qobject = proto.toQObject())
- canCast = qobject->qt_metacast(className) != 0;
- }
-#endif
- if (canCast) {
- QByteArray varTypeName = QMetaType::typeName(var.userType());
- if (varTypeName.endsWith('*'))
- *reinterpret_cast<void* *>(ptr) = *reinterpret_cast<void* *>(var.data());
- else
- *reinterpret_cast<void* *>(ptr) = var.data();
- return true;
- }
- proto = proto.prototype();
- }
- }
- } else if (value.isNull() && name.endsWith('*')) {
- *reinterpret_cast<void* *>(ptr) = 0;
- return true;
- } else if (type == qMetaTypeId<QScriptValue>()) {
- if (!eng)
- return false;
- *reinterpret_cast<QScriptValue*>(ptr) = eng->toPublic(value);
- return true;
- } else if (name == "QVariant") {
- *reinterpret_cast<QVariant*>(ptr) = value.toVariant();
- return true;
- }
-
- // lazy registration of some common list types
-#ifndef QT_NO_QOBJECT
- else if (type == qMetaTypeId<QObjectList>()) {
- if (!eng)
- return false;
- qScriptRegisterSequenceMetaType<QObjectList>(eng->q_func());
- return convert(value, type, ptr, eng);
- }
-#endif
- else if (type == qMetaTypeId<QList<int> >()) {
- if (!eng)
- return false;
- qScriptRegisterSequenceMetaType<QList<int> >(eng->q_func());
- return convert(value, type, ptr, eng);
- }
-
-#if 0
- if (!name.isEmpty()) {
- qWarning("QScriptEngine::convert: unable to convert value to type `%s'",
- name.constData());
- }
-#endif
- return false;
-}
-
-QScriptEngine::DemarshalFunction QScriptEnginePrivate::demarshalFunction(int type) const
-{
- return m_customTypes.value(type).demarshal;
-}
-
-QScriptValuePrivate *QScriptEnginePrivate::registerValue(const QScriptValueImpl &value)
-{
- if (value.isString()) {
- QScriptNameIdImpl *id = value.stringValue();
- QScriptValuePrivate *p = m_stringHandles.value(id);
- if (p)
- return p;
- p = m_handleRepository.get();
- p->engine = q_func();
- p->value = value;
- m_stringHandles.insert(id, p);
- return p;
- } else if (value.isObject()) {
- QScriptObject *instance = value.objectValue();
- QScriptValuePrivate *p = m_objectHandles.value(instance);
- if (p)
- return p;
- p = m_handleRepository.get();
- p->engine = q_func();
- p->value = value;
- m_objectHandles.insert(instance, p);
- return p;
- }
- QScriptValuePrivate *p = m_handleRepository.get();
- p->engine = q_func();
- p->value = value;
- m_otherHandles.append(p);
- return p;
-}
-
-QScriptEnginePrivate::QScriptEnginePrivate()
-{
- m_undefinedValue = QScriptValueImpl(QScriptValue::UndefinedValue);
- m_nullValue = QScriptValueImpl(QScriptValue::NullValue);
-
- m_evaluating = false;
- m_abort = false;
- m_callDepth = 0;
-#if defined(Q_OS_WIN)
- m_maxCallDepth = 88;
-#elif defined(Q_OS_MAC)
- m_maxCallDepth = 640;
-#elif defined(QT_ARCH_ARM) || defined(QT_ARCH_ARMV6)
- m_maxCallDepth = 360;
-#else
- m_maxCallDepth = 512;
-#endif
- m_oldStringRepositorySize = 0;
- m_oldTempStringRepositorySize = 0;
- m_newAllocatedStringRepositoryChars = 0;
- m_newAllocatedTempStringRepositoryChars = 0;
- m_context = 0;
- m_abstractSyntaxTree = 0;
- m_lexer = 0;
- m_scriptCounter = 0;
- m_agent = 0;
- m_objectGeneration = 0;
- m_class_prev_id = QScriptClassInfo::CustomType;
- m_next_object_id = 0;
- m_gc_depth = -1;
-
- objectConstructor = 0;
- numberConstructor = 0;
- booleanConstructor = 0;
- stringConstructor = 0;
- dateConstructor = 0;
- functionConstructor = 0;
- arrayConstructor = 0;
- regexpConstructor = 0;
- errorConstructor = 0;
- enumerationConstructor = 0;
- variantConstructor = 0;
- qobjectConstructor = 0;
- qmetaObjectConstructor = 0;
-
- m_processEventsInterval = -1;
- m_nextProcessEvents = 0;
- m_processEventIncr = 0;
-
- m_stringRepository.reserve(DefaultHashSize);
- m_string_hash_size = DefaultHashSize;
- m_string_hash_base = new QScriptNameIdImpl* [m_string_hash_size];
- memset(m_string_hash_base, 0, sizeof(QScriptNameIdImpl*) * m_string_hash_size);
-
- tempStackBegin = 0;
-}
-
-void QScriptEnginePrivate::init()
-{
- qMetaTypeId<QScriptValue>();
- qMetaTypeId<QList<int> >();
-#ifndef QT_NO_QOBJECT
- qMetaTypeId<QObjectList>();
-#endif
-
- m_class_prev_id = QScriptClassInfo::CustomType;
- m_class_object = registerClass(QLatin1String("Object"), QScriptClassInfo::ObjectType);
- m_class_function = registerClass(QLatin1String("Function"), QScriptClassInfo::FunctionType);
- m_class_activation = registerClass(QLatin1String("activation"), QScriptClassInfo::ActivationType);
-
- m_class_arguments = registerClass(QLatin1String("arguments"), QScript::ObjectType);
- m_class_arguments->setData(new QScript::ArgumentsClassData());
-
- m_class_with = registerClass(QLatin1String("__qscript_internal_with"), QScript::ObjectType);
-
- // public name ids
- m_id_table.id_constructor = nameId(QLatin1String("constructor"), true);
- m_id_table.id_false = nameId(QLatin1String("false"), true);
- m_id_table.id_null = nameId(QLatin1String("null"), true);
- m_id_table.id_object = nameId(QLatin1String("object"), true);
- m_id_table.id_pointer = nameId(QLatin1String("pointer"), true);
- m_id_table.id_prototype = nameId(QLatin1String("prototype"), true);
- m_id_table.id_arguments = nameId(QLatin1String("arguments"), true);
- m_id_table.id_this = nameId(QLatin1String("this"), true);
- m_id_table.id_toString = nameId(QLatin1String("toString"), true);
- m_id_table.id_true = nameId(QLatin1String("true"), true);
- m_id_table.id_undefined = nameId(QLatin1String("undefined"), true);
- m_id_table.id_valueOf = nameId(QLatin1String("valueOf"), true);
- m_id_table.id_length = nameId(QLatin1String("length"), true);
- m_id_table.id_callee = nameId(QLatin1String("callee"), true);
- m_id_table.id___proto__ = nameId(QLatin1String("__proto__"), true);
- m_id_table.id___qt_sender__ = nameId(QLatin1String("__qt_sender__"), true);
-
- const int TEMP_STACK_SIZE = 10 * 1024;
- tempStackBegin = new QScriptValueImpl[TEMP_STACK_SIZE];
- tempStackEnd = tempStackBegin + TEMP_STACK_SIZE;
- tempStackBegin[0] = m_undefinedValue;
-
- objectAllocator.blockGC(true);
-
- QScript::Ecma::Global::construct(&m_globalObject, this);
-
- // create the prototypes first...
- objectConstructor = new QScript::Ecma::Object(this, m_class_object);
- functionConstructor = new QScript::Ecma::Function(this, m_class_function);
- // ... then we can initialize
- functionConstructor->initialize();
- objectConstructor->initialize();
-
- numberConstructor = new QScript::Ecma::Number(this);
- booleanConstructor = new QScript::Ecma::Boolean(this);
- stringConstructor = new QScript::Ecma::String(this);
- dateConstructor = new QScript::Ecma::Date(this);
- arrayConstructor = new QScript::Ecma::Array(this);
- regexpConstructor = new QScript::Ecma::RegExp(this);
- errorConstructor = new QScript::Ecma::Error(this);
-
- QScript::Ecma::Global::initialize(&m_globalObject, this);
-
- const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration;
-
- m_globalObject.setProperty(QLatin1String("Object"),
- objectConstructor->ctor, flags);
- m_globalObject.setProperty(QLatin1String("Function"),
- functionConstructor->ctor, flags);
- m_globalObject.setProperty(QLatin1String("Number"),
- numberConstructor->ctor, flags);
- m_globalObject.setProperty(QLatin1String("Boolean"),
- booleanConstructor->ctor, flags);
- m_globalObject.setProperty(QLatin1String("String"),
- stringConstructor->ctor, flags);
- m_globalObject.setProperty(QLatin1String("Date"),
- dateConstructor->ctor, flags);
- m_globalObject.setProperty(QLatin1String("Array"),
- arrayConstructor->ctor, flags);
- m_globalObject.setProperty(QLatin1String("RegExp"),
- regexpConstructor->ctor, flags);
- m_globalObject.setProperty(QLatin1String("Error"),
- errorConstructor->ctor, flags);
-
- m_globalObject.setProperty(QLatin1String("EvalError"),
- errorConstructor->evalErrorCtor, flags);
- m_globalObject.setProperty(QLatin1String("RangeError"),
- errorConstructor->rangeErrorCtor, flags);
- m_globalObject.setProperty(QLatin1String("ReferenceError"),
- errorConstructor->referenceErrorCtor, flags);
- m_globalObject.setProperty(QLatin1String("SyntaxError"),
- errorConstructor->syntaxErrorCtor, flags);
- m_globalObject.setProperty(QLatin1String("TypeError"),
- errorConstructor->typeErrorCtor, flags);
- m_globalObject.setProperty(QLatin1String("URIError"),
- errorConstructor->uriErrorCtor, flags);
-
- QScriptValueImpl tmp; // ### fixme
- m_evalFunction = new QScript::EvalFunction(this);
- functionConstructor->newFunction(&tmp, m_evalFunction);
- m_globalObject.setProperty(QLatin1String("eval"), tmp, flags);
-
- QScriptValueImpl mathObject;
- QScript::Ecma::Math::construct(&mathObject, this);
- m_globalObject.setProperty(QLatin1String("Math"), mathObject, flags);
-
- enumerationConstructor = new QScript::Ext::Enumeration(this);
-
- variantConstructor = new QScript::Ext::Variant(this);
-
-#ifndef QT_NO_QOBJECT
- qobjectConstructor = new QScript::ExtQObject(this);
- qmetaObjectConstructor = new QScript::ExtQMetaObject(this);
-#endif
-
- objectAllocator.blockGC(false);
-
- QScriptContextPrivate *context_p = pushContext();
- context_p->setActivationObject(m_globalObject);
- context_p->setThisObject(m_globalObject);
-}
-
-#if !defined(QT_NO_QOBJECT) && !defined(QT_NO_LIBRARY)
-static QScriptValueImpl __setupPackage__(QScriptContextPrivate *ctx,
- QScriptEnginePrivate *eng,
- QScriptClassInfo *)
-{
- QString path = ctx->argument(0).toString();
- QStringList components = path.split(QLatin1Char('.'));
- QScriptValueImpl o = eng->globalObject();
- for (int i = 0; i < components.count(); ++i) {
- QString name = components.at(i);
- QScriptValueImpl oo = o.property(name);
- if (!oo.isValid()) {
- oo = eng->newObject();
- o.setProperty(name, oo);
- }
- o = oo;
- }
- return o;
-}
-#endif
-
-QScriptValueImpl QScriptEnginePrivate::importExtension(const QString &extension)
-{
-#if defined(QT_NO_QOBJECT) || defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS)
- Q_UNUSED(extension);
-#else
- Q_Q(QScriptEngine);
- if (m_importedExtensions.contains(extension))
- return undefinedValue(); // already imported
-
- QScriptContextPrivate *context = currentContext();
- QCoreApplication *app = QCoreApplication::instance();
- if (!app)
- return context->throwError(QLatin1String("No application object"));
-
- QObjectList staticPlugins = QPluginLoader::staticInstances();
- QStringList libraryPaths = app->libraryPaths();
- QString dot = QLatin1String(".");
- QStringList pathComponents = extension.split(dot);
- QString initDotJs = QLatin1String("__init__.js");
-
- QString ext;
- for (int i = 0; i < pathComponents.count(); ++i) {
- if (!ext.isEmpty())
- ext.append(dot);
- ext.append(pathComponents.at(i));
- if (m_importedExtensions.contains(ext))
- continue; // already imported
-
- if (m_extensionsBeingImported.contains(ext)) {
- return context->throwError(QString::fromLatin1("recursive import of %0")
- .arg(extension));
- }
- m_extensionsBeingImported.insert(ext);
-
- QScriptExtensionInterface *iface = 0;
- QString initjsContents;
- QString initjsFileName;
-
- // look for the extension in static plugins
- for (int j = 0; j < staticPlugins.size(); ++j) {
- iface = qobject_cast<QScriptExtensionInterface*>(staticPlugins.at(j));
- if (!iface)
- continue;
- if (iface->keys().contains(ext))
- break; // use this one
- else
- iface = 0; // keep looking
- }
-
- {
- // look for __init__.js resource
- QString path = QString::fromLatin1(":/qtscriptextension");
- for (int j = 0; j <= i; ++j) {
- path.append(QLatin1Char('/'));
- path.append(pathComponents.at(j));
- }
- path.append(QLatin1Char('/'));
- path.append(initDotJs);
- QFile file(path);
- if (file.open(QIODevice::ReadOnly)) {
- QTextStream ts(&file);
- initjsContents = ts.readAll();
- initjsFileName = path;
- file.close();
- }
- }
-
- if (!iface && initjsContents.isEmpty()) {
- // look for the extension in library paths
- for (int j = 0; j < libraryPaths.count(); ++j) {
- QString libPath = libraryPaths.at(j) + QDir::separator() + QLatin1String("script");
- QDir dir(libPath);
- if (!dir.exists(dot))
- continue;
-
- // look for C++ plugin
- QFileInfoList files = dir.entryInfoList(QDir::Files);
- for (int k = 0; k < files.count(); ++k) {
- QFileInfo entry = files.at(k);
- QString filePath = entry.canonicalFilePath();
- QPluginLoader loader(filePath);
- iface = qobject_cast<QScriptExtensionInterface*>(loader.instance());
- if (iface) {
- if (iface->keys().contains(ext))
- break; // use this one
- else
- iface = 0; // keep looking
- }
- }
-
- // look for __init__.js in the corresponding dir
- QDir dirdir(libPath);
- bool dirExists = dirdir.exists();
- for (int k = 0; dirExists && (k <= i); ++k)
- dirExists = dirdir.cd(pathComponents.at(k));
- if (dirExists && dirdir.exists(initDotJs)) {
- QFile file(dirdir.canonicalPath()
- + QDir::separator() + initDotJs);
- if (file.open(QIODevice::ReadOnly)) {
- QTextStream ts(&file);
- initjsContents = ts.readAll();
- initjsFileName = file.fileName();
- file.close();
- }
- }
-
- if (iface || !initjsContents.isEmpty())
- break;
- }
- }
-
- if (!iface && initjsContents.isEmpty()) {
- m_extensionsBeingImported.remove(ext);
- return context->throwError(
- QString::fromLatin1("Unable to import %0: no such extension")
- .arg(extension));
- }
-
- // initialize the extension in a new context
- QScriptContextPrivate *ctx_p = pushContext();
- ctx_p->setThisObject(globalObject());
- newActivation(&ctx_p->m_activation);
- QScriptObject *activation_data = ctx_p->m_activation.m_object_value;
- activation_data->m_scope = globalObject();
-
- activation_data->m_members.resize(4);
- activation_data->m_values.resize(4);
- activation_data->m_members[0].object(
- nameId(QLatin1String("__extension__")), 0,
- QScriptValue::ReadOnly | QScriptValue::Undeletable);
- activation_data->m_values[0] = QScriptValueImpl(this, ext);
- activation_data->m_members[1].object(
- nameId(QLatin1String("__setupPackage__")), 1, 0);
- activation_data->m_values[1] = createFunction(__setupPackage__, 0, 0);
- activation_data->m_members[2].object(
- nameId(QLatin1String("__all__")), 2, 0);
- activation_data->m_values[2] = undefinedValue();
- activation_data->m_members[3].object(
- nameId(QLatin1String("__postInit__")), 3, 0);
- activation_data->m_values[3] = undefinedValue();
-
- // the script is evaluated first
- if (!initjsContents.isEmpty()) {
- evaluate(ctx_p, initjsContents, /*lineNumber=*/1, initjsFileName);
- if (hasUncaughtException()) {
- QScriptValueImpl r = ctx_p->returnValue();
- popContext();
- m_extensionsBeingImported.remove(ext);
- return r;
- }
- }
-
- // next, the C++ plugin is called
- if (iface) {
- iface->initialize(ext, q);
- if (hasUncaughtException()) {
- QScriptValueImpl r = ctx_p->returnValue();
- popContext();
- m_extensionsBeingImported.remove(ext);
- return r;
- }
- }
-
- // if the __postInit__ function has been set, we call it
- QScriptValueImpl postInit = ctx_p->m_activation.property(QLatin1String("__postInit__"));
- if (postInit.isFunction()) {
- postInit.call(globalObject());
- if (hasUncaughtException()) {
- QScriptValueImpl r = ctx_p->returnValue();
- popContext();
- m_extensionsBeingImported.remove(ext);
- return r;
- }
- }
-
- popContext();
-
- m_importedExtensions.insert(ext);
- m_extensionsBeingImported.remove(ext);
- } // for (i)
-#endif // QT_NO_QOBJECT
- return undefinedValue();
-}
-
-QStringList QScriptEnginePrivate::availableExtensions() const
-{
-#if defined(QT_NO_QOBJECT) || defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS)
- return QStringList();
-#else
- QCoreApplication *app = QCoreApplication::instance();
- if (!app)
- return QStringList();
-
- QSet<QString> result;
-
- QObjectList staticPlugins = QPluginLoader::staticInstances();
- for (int i = 0; i < staticPlugins.size(); ++i) {
- QScriptExtensionInterface *iface;
- iface = qobject_cast<QScriptExtensionInterface*>(staticPlugins.at(i));
- if (iface) {
- QStringList keys = iface->keys();
- for (int j = 0; j < keys.count(); ++j)
- result << keys.at(j);
- }
- }
-
- QStringList libraryPaths = app->libraryPaths();
- for (int i = 0; i < libraryPaths.count(); ++i) {
- QString libPath = libraryPaths.at(i) + QDir::separator() + QLatin1String("script");
- QDir dir(libPath);
- if (!dir.exists())
- continue;
-
- // look for C++ plugins
- QFileInfoList files = dir.entryInfoList(QDir::Files);
- for (int j = 0; j < files.count(); ++j) {
- QFileInfo entry = files.at(j);
- QString filePath = entry.canonicalFilePath();
- QPluginLoader loader(filePath);
- QScriptExtensionInterface *iface;
- iface = qobject_cast<QScriptExtensionInterface*>(loader.instance());
- if (iface) {
- QStringList keys = iface->keys();
- for (int k = 0; k < keys.count(); ++k)
- result << keys.at(k);
- }
- }
-
- // look for scripts
- QString initDotJs = QLatin1String("__init__.js");
- QList<QFileInfo> stack;
- stack << dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
- while (!stack.isEmpty()) {
- QFileInfo entry = stack.takeLast();
- QDir dd(entry.canonicalFilePath());
- if (dd.exists(initDotJs)) {
- QString rpath = dir.relativeFilePath(dd.canonicalPath());
- QStringList components = rpath.split(QLatin1Char('/'));
- result << components.join(QLatin1String("."));
- stack << dd.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
- }
- }
- }
-
- QStringList lst = result.toList();
- qSort(lst);
- return lst;
-#endif
-}
-
-QStringList QScriptEnginePrivate::importedExtensions() const
-{
- QStringList lst = m_importedExtensions.toList();
- qSort(lst);
- return lst;
-}
-
-void QScriptEnginePrivate::gc()
-{
- if (!objectAllocator.blocked()) {
- // do the GC now
- maybeGC_helper(/*do_string_gc=*/true);
- } else {
- // GC will be performed the next time maybeGC()
- // is called and the allocator is not blocked
- objectAllocator.requestGC();
- }
-}
-
-QStringList QScriptEnginePrivate::uncaughtExceptionBacktrace() const
-{
- QScriptValueImpl value = uncaughtException();
- if (!value.isError())
- return m_exceptionBacktrace;
- return QScript::Ecma::Error::backtrace(value);
-}
-
-void QScriptEnginePrivate::clearExceptions()
-{
- m_exceptionBacktrace = QStringList();
- QScriptContextPrivate *ctx_p = currentContext();
- while (ctx_p) {
- ctx_p->m_state = QScriptContext::NormalState;
- ctx_p = ctx_p->parentContext();
- }
-}
-
-#ifndef QT_NO_QOBJECT
-void QScriptEnginePrivate::emitSignalHandlerException()
-{
- Q_Q(QScriptEngine);
- emit q->signalHandlerException(toPublic(uncaughtException()));
-}
-#endif
-
-void QScriptEnginePrivate::processEvents()
-{
-#ifndef QT_NO_QOBJECT
- Q_ASSERT(m_processEventTracker.isValid());
- int elapsed = m_processEventTracker.elapsed();
- if (m_nextProcessEvents < elapsed) {
- do {
- m_nextProcessEvents = m_nextProcessEvents + m_processEventsInterval;
- } while (m_nextProcessEvents < elapsed);
- QCoreApplication::processEvents();
- }
-#endif
-}
-
-void QScriptEnginePrivate::setupProcessEvents()
-{
- if (m_processEventsInterval > 0) {
- m_nextProcessEvents = m_processEventsInterval;
- m_processEventIncr = 0;
- m_processEventTracker.restart();
- }
-}
-
-void QScriptEnginePrivate::abortEvaluation(const QScriptValueImpl &result)
-{
- m_abort = true;
- currentContext()->setReturnValue(result);
-}
-
-#ifndef QT_NO_QOBJECT
-
-void QScriptEnginePrivate::newQObject(QScriptValueImpl *out, QObject *object,
- QScriptEngine::ValueOwnership ownership,
- const QScriptEngine::QObjectWrapOptions &options,
- bool setDefaultPrototype)
-{
- if (!object) {
- *out = m_nullValue;
- return;
- }
- Q_ASSERT(qobjectConstructor != 0);
- QScriptQObjectData *data = qobjectData(object);
- bool preferExisting = (options & QScriptEngine::PreferExistingWrapperObject) != 0;
- QScriptEngine::QObjectWrapOptions opt = options & ~QScriptEngine::PreferExistingWrapperObject;
- QScriptValueImpl existingWrapper;
- bool hasExisting = data->findWrapper(ownership, opt, &existingWrapper);
- if (preferExisting) {
- if (hasExisting) {
- *out = existingWrapper;
- } else {
- qobjectConstructor->newQObject(out, object, ownership, opt);
- data->registerWrapper(*out, ownership, opt);
- }
- } else {
- qobjectConstructor->newQObject(out, object, ownership, opt);
- if (!hasExisting)
- data->registerWrapper(*out, ownership, opt);
- }
-
- if (setDefaultPrototype) {
- const QMetaObject *meta = object->metaObject();
- while (meta) {
- QByteArray typeString = meta->className();
- typeString.append('*');
- int typeId = QMetaType::type(typeString);
- if (typeId != 0) {
- QScriptValueImpl proto = defaultPrototype(typeId);
- if (proto.isValid()) {
- out->setPrototype(proto);
- break;
- }
- }
- meta = meta->superClass();
- }
- }
-}
-
-QScriptQObjectData *QScriptEnginePrivate::qobjectData(QObject *object)
-{
- QHash<QObject*, QScriptQObjectData*>::const_iterator it;
- it = m_qobjectData.constFind(object);
- if (it != m_qobjectData.constEnd())
- return it.value();
-
- QScriptQObjectData *data = new QScriptQObjectData();
- m_qobjectData.insert(object, data);
- QObject::connect(object, SIGNAL(destroyed(QObject*)),
- q_func(), SLOT(_q_objectDestroyed(QObject *)));
- return data;
-}
-
-void QScriptEnginePrivate::_q_objectDestroyed(QObject *object)
-{
- QHash<QObject*, QScriptQObjectData*>::iterator it;
- it = m_qobjectData.find(object);
- Q_ASSERT(it != m_qobjectData.end());
- QScriptQObjectData *data = it.value();
- m_qobjectData.erase(it);
- delete data;
-}
-
-void QScriptEnginePrivate::disposeQObject(QObject *object)
-{
- if (isCollecting()) {
- // wait until we're done with GC before deleting it
- int index = m_qobjectsToBeDeleted.indexOf(object);
- if (index == -1)
- m_qobjectsToBeDeleted.append(object);
- } else {
- delete object;
- }
-}
-
-void QScriptEnginePrivate::deletePendingQObjects()
-{
- while (!m_qobjectsToBeDeleted.isEmpty())
- delete m_qobjectsToBeDeleted.takeFirst();
-}
-
-bool QScriptEnginePrivate::scriptConnect(QObject *sender, const char *signal,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function)
-{
- Q_ASSERT(sender);
- Q_ASSERT(signal);
- const QMetaObject *meta = sender->metaObject();
- int index = meta->indexOfSignal(QMetaObject::normalizedSignature(signal+1));
- if (index == -1)
- return false;
- return scriptConnect(sender, index, receiver, function);
-}
-
-bool QScriptEnginePrivate::scriptDisconnect(QObject *sender, const char *signal,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function)
-{
- Q_ASSERT(sender);
- Q_ASSERT(signal);
- const QMetaObject *meta = sender->metaObject();
- int index = meta->indexOfSignal(QMetaObject::normalizedSignature(signal+1));
- if (index == -1)
- return false;
- return scriptDisconnect(sender, index, receiver, function);
-}
-
-bool QScriptEnginePrivate::scriptConnect(QObject *sender, int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function,
- const QScriptValueImpl &senderWrapper)
-{
- QScriptQObjectData *data = qobjectData(sender);
- return data->addSignalHandler(sender, signalIndex, receiver, function, senderWrapper);
-}
-
-bool QScriptEnginePrivate::scriptDisconnect(QObject *sender, int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function)
-{
- QScriptQObjectData *data = qobjectData(sender);
- if (!data)
- return false;
- return data->removeSignalHandler(sender, signalIndex, receiver, function);
-}
-
-bool QScriptEnginePrivate::scriptConnect(const QScriptValueImpl &signal,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function)
-{
- QScript::QtFunction *fun = static_cast<QScript::QtFunction*>(signal.toFunction());
- int index = fun->mostGeneralMethod();
- return scriptConnect(fun->qobject(), index, receiver, function, fun->object());
-}
-
-bool QScriptEnginePrivate::scriptDisconnect(const QScriptValueImpl &signal,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function)
-{
- QScript::QtFunction *fun = static_cast<QScript::QtFunction*>(signal.toFunction());
- int index = fun->mostGeneralMethod();
- return scriptDisconnect(fun->qobject(), index, receiver, function);
-}
-
-bool QScriptEnginePrivate::convertToNativeQObject(const QScriptValueImpl &value,
- const QByteArray &targetType,
- void **result)
-{
- if (!targetType.endsWith('*'))
- return false;
- if (QObject *qobject = value.toQObject()) {
- int start = targetType.startsWith("const ") ? 6 : 0;
- QByteArray className = targetType.mid(start, targetType.size()-start-1);
- if (void *instance = qobject->qt_metacast(className)) {
- *result = instance;
- return true;
- }
- }
- return false;
-}
-
-#endif // QT_NO_QOBJECT
-
-void QScriptEnginePrivate::setAgent(QScriptEngineAgent *agent)
-{
- Q_Q(QScriptEngine);
- if (agent && (agent->engine() != q)) {
- qWarning("QScriptEngine::setAgent(): "
- "cannot set agent belonging to different engine");
- return;
- }
- if (agent) {
- int index = m_agents.indexOf(agent);
- if (index == -1)
- m_agents.append(agent);
- }
- m_agent = agent;
-}
-
-QScriptEngineAgent *QScriptEnginePrivate::agent() const
-{
- return m_agent;
-}
-
-void QScriptEnginePrivate::agentDeleted(QScriptEngineAgent *agent)
-{
- m_agents.removeOne(agent);
- if (m_agent == agent)
- m_agent = 0;
-}
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
-qint64 QScriptEnginePrivate::nextScriptId()
-{
- // ### reuse IDs by using a pool
- return m_scriptCounter++;
-}
-
-void QScriptEnginePrivate::notifyScriptLoad_helper(qint64 id, const QString &program,
- const QString &fileName, int lineNumber)
-{
- m_agent->scriptLoad(id, program, fileName, lineNumber);
-}
-
-void QScriptEnginePrivate::notifyScriptUnload_helper(qint64 id)
-{
- m_agent->scriptUnload(id);
-}
-
-void QScriptEnginePrivate::notifyPositionChange_helper(QScriptContextPrivate *ctx)
-{
- m_agent->positionChange(ctx->scriptId(), ctx->currentLine, ctx->currentColumn);
-}
-
-void QScriptEnginePrivate::notifyContextPush_helper()
-{
- m_agent->contextPush();
-}
-
-void QScriptEnginePrivate::notifyContextPop_helper()
-{
- m_agent->contextPop();
-}
-
-void QScriptEnginePrivate::notifyFunctionEntry_helper(QScriptContextPrivate *ctx)
-{
- m_agent->functionEntry(ctx->scriptId());
-}
-
-void QScriptEnginePrivate::notifyFunctionExit_helper(QScriptContextPrivate *ctx)
-{
- m_agent->functionExit(ctx->scriptId(), toPublic(ctx->returnValue()));
-}
-
-void QScriptEnginePrivate::notifyException_helper(QScriptContextPrivate *ctx)
-{
- bool hasHandler = (ctx->exceptionHandlerContext() != 0);
- m_agent->exceptionThrow(ctx->scriptId(), toPublic(ctx->returnValue()), hasHandler);
-}
-
-void QScriptEnginePrivate::notifyExceptionCatch_helper(QScriptContextPrivate *ctx)
-{
- m_agent->exceptionCatch(ctx->scriptId(), toPublic(ctx->returnValue()));
-}
-
-void QScriptEnginePrivate::notifyDebugger(QScriptContextPrivate *ctx)
-{
- if (m_agent && m_agent->supportsExtension(QScriptEngineAgent::DebuggerInvocationRequest)) {
- QVariantList args;
- args.append(ctx->scriptId());
- args.append(ctx->currentLine);
- args.append(ctx->currentColumn);
- QVariant ret = m_agent->extension(QScriptEngineAgent::DebuggerInvocationRequest, args);
- QScriptValueImpl val = valueFromVariant(ret);
- if (val.isValid())
- ctx->m_result = val;
- }
-}
-
-#endif // Q_SCRIPT_NO_EVENT_NOTIFY
-
-QScriptString QScriptEnginePrivate::internedString(const QString &str)
-{
- return internedString(nameId(str, /*persistent=*/false));
-}
-
-QScriptString QScriptEnginePrivate::internedString(QScriptNameIdImpl *nid)
-{
- if (!nid)
- return QScriptString();
- QScriptStringPrivate *d = m_internedStrings.value(nid);
- if (!d) {
- d = m_internedStringRepository.get();
- d->nameId = nid;
- d->engine = this;
- m_internedStrings.insert(d->nameId, d);
- }
- QScriptString result;
- QScriptStringPrivate::init(result, d);
- return result;
-}
-
-void QScriptEnginePrivate::uninternString(QScriptStringPrivate *d)
-{
- Q_ASSERT(d->nameId);
- QHash<QScriptNameIdImpl*, QScriptStringPrivate*>::iterator it;
- it = m_internedStrings.find(d->nameId);
- Q_ASSERT(it != m_internedStrings.end());
- m_internedStrings.erase(it);
- m_internedStringRepository.release(d);
-}
-
-QScriptValueImpl QScriptEnginePrivate::toImpl_helper(const QScriptValue &value)
-{
- QScriptValuePrivate *p = QScriptValuePrivate::get(value);
- Q_ASSERT(p != 0);
- Q_ASSERT(p->value.type() == QScript::LazyStringType);
- QString str = *p->value.m_lazy_string_value;
- if (!p->ref.deref())
- delete p;
- QScriptValueImpl v;
- newString(&v, str);
- p = registerValue(v);
- QScriptValuePrivate::init(const_cast<QScriptValue&>(value), p);
- return v;
-}
-
-QScriptValueImpl QScriptEnginePrivate::newObject(QScriptClass *scriptClass,
- const QScriptValueImpl &data)
-{
- if (!scriptClass)
- return QScriptValueImpl();
- QScriptValueImpl v;
- QScriptValueImpl proto = toImpl(scriptClass->prototype());
- if (!proto.isObject())
- proto = objectConstructor->publicPrototype;
- newObject(&v, proto);
- QScriptClassPrivate *cls_p = QScriptClassPrivate::get(scriptClass);
- QScriptClassInfo *info = cls_p->classInfo();
- v.setClassInfo(info);
- if (info->type() & QScriptClassInfo::FunctionBased) {
- QScriptFunction *fun = cls_p->newFunction();
- v.setObjectData(fun);
- }
- v.setInternalValue(data);
- return v;
-}
-
-int QScriptEnginePrivate::registerCustomClassType()
-{
- return ++m_class_prev_id;
-}
-
-QScriptValueImpl QScriptEnginePrivate::objectById(qint64 id) const
-{
- QScript::GCAlloc<QScriptObject>::const_iterator it;
- for (it = objectAllocator.constBegin(); it != objectAllocator.constEnd(); ++it) {
- const QScriptObject *obj = it.data();
- if (obj->m_id == id) {
- QScriptValueImpl ret;
- ret.m_type = QScript::ObjectType;
- ret.m_object_value = const_cast<QScriptObject*>(obj);
- return ret;
- }
- }
- return QScriptValueImpl();
-}
-
-namespace QScript {
-
-static QScriptValueImpl qsTranslate(QScriptContextPrivate *ctx, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- if (ctx->argumentCount() < 2)
- return ctx->throwError(QString::fromLatin1("qsTranslate() requires at least two arguments"));
- if (!ctx->argument(0).isString())
- return ctx->throwError(QString::fromLatin1("qsTranslate(): first argument (context) must be a string"));
- if (!ctx->argument(1).isString())
- return ctx->throwError(QString::fromLatin1("qsTranslate(): second argument (text) must be a string"));
- if ((ctx->argumentCount() > 2) && !ctx->argument(2).isString())
- return ctx->throwError(QString::fromLatin1("qsTranslate(): third argument (comment) must be a string"));
- if ((ctx->argumentCount() > 3) && !ctx->argument(3).isString())
- return ctx->throwError(QString::fromLatin1("qsTranslate(): fourth argument (encoding) must be a string"));
- if ((ctx->argumentCount() > 4) && !ctx->argument(4).isNumber())
- return ctx->throwError(QString::fromLatin1("qsTranslate(): fifth argument (n) must be a number"));
-#ifndef QT_NO_QOBJECT
- QString context = ctx->argument(0).toString();
-#endif
- QString text = ctx->argument(1).toString();
-#ifndef QT_NO_QOBJECT
- QString comment;
- if (ctx->argumentCount() > 2)
- comment = ctx->argument(2).toString();
- QCoreApplication::Encoding encoding = QCoreApplication::CodecForTr;
- if (ctx->argumentCount() > 3) {
- QString encStr = ctx->argument(3).toString();
- if (encStr == QLatin1String("CodecForTr"))
- encoding = QCoreApplication::CodecForTr;
- else if (encStr == QLatin1String("UnicodeUTF8"))
- encoding = QCoreApplication::UnicodeUTF8;
- else
- return ctx->throwError(QString::fromLatin1("qsTranslate(): invalid encoding '%s'").arg(encStr));
- }
- int n = -1;
- if (ctx->argumentCount() > 4)
- n = ctx->argument(4).toInt32();
-#endif
- QString result;
-#ifndef QT_NO_QOBJECT
- result = QCoreApplication::translate(context.toLatin1().constData(),
- text.toLatin1().constData(),
- comment.toLatin1().constData(),
- encoding, n);
-#else
- result = text;
-#endif
- return QScriptValueImpl(eng, result);
-}
-
-static QScriptValueImpl qTranslateNoOp(QScriptContextPrivate *ctx, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- return ctx->argument(1);
-}
-
-static QScriptValueImpl qsTr(QScriptContextPrivate *ctx, QScriptEnginePrivate *eng, QScriptClassInfo *)
-{
- if (ctx->argumentCount() < 1)
- return ctx->throwError(QString::fromLatin1("qsTr() requires at least one argument"));
- if (!ctx->argument(0).isString())
- return ctx->throwError(QString::fromLatin1("qsTr(): first argument (text) must be a string"));
- if ((ctx->argumentCount() > 1) && !ctx->argument(1).isString())
- return ctx->throwError(QString::fromLatin1("qsTr(): second argument (comment) must be a string"));
- if ((ctx->argumentCount() > 2) && !ctx->argument(2).isNumber())
- return ctx->throwError(QString::fromLatin1("qsTranslate(): third argument (n) must be a number"));
-#ifndef QT_NO_QOBJECT
- QString context;
- if (ctx->parentContext())
- context = QFileInfo(ctx->parentContext()->fileName()).baseName();
-#endif
- QString text = ctx->argument(0).toString();
-#ifndef QT_NO_QOBJECT
- QString comment;
- if (ctx->argumentCount() > 1)
- comment = ctx->argument(1).toString();
- int n = -1;
- if (ctx->argumentCount() > 2)
- n = ctx->argument(2).toInt32();
-#endif
- QString result;
-#ifndef QT_NO_QOBJECT
- result = QCoreApplication::translate(context.toLatin1().constData(),
- text.toLatin1().constData(),
- comment.toLatin1().constData(),
- QCoreApplication::CodecForTr, n);
-#else
- result = text;
-#endif
- return QScriptValueImpl(eng, result);
-}
-
-static QScriptValueImpl qTrNoOp(QScriptContextPrivate *ctx, QScriptEnginePrivate *, QScriptClassInfo *)
-{
- return ctx->argument(0);
-}
-
-} // namespace QScript
-
-void QScriptEnginePrivate::installTranslatorFunctions(QScriptValueImpl &object)
-{
- Q_ASSERT(object.isObject());
- const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration;
- object.setProperty(QLatin1String("qsTranslate"),
- createFunction(QScript::qsTranslate, /*length=*/5, /*classInfo=*/0),
- flags);
- object.setProperty(QLatin1String("QT_TRANSLATE_NOOP"),
- createFunction(QScript::qTranslateNoOp, /*length=*/2, /*classInfo=*/0),
- flags);
- object.setProperty(QLatin1String("qsTr"),
- createFunction(QScript::qsTr, /*length=*/3, /*classInfo=*/0),
- flags);
- object.setProperty(QLatin1String("QT_TR_NOOP"),
- createFunction(QScript::qTrNoOp, /*length=*/1, /*classInfo=*/0),
- flags);
-
- stringConstructor->addPrototypeFunction(QLatin1String("arg"), QScript::Ecma::String::method_ext_arg, 1);
-}
-
-bool QScriptEnginePrivate::canEvaluate(const QString &program)
-{
- QScript::SyntaxChecker checker;
- QScript::SyntaxChecker::Result result = checker.checkSyntax(program);
- return (result.state != QScript::SyntaxChecker::Intermediate);
-}
-
-QScriptSyntaxCheckResult QScriptEnginePrivate::checkSyntax(const QString &program)
-{
- QScript::SyntaxChecker checker;
- QScript::SyntaxChecker::Result result = checker.checkSyntax(program);
- QScriptSyntaxCheckResultPrivate *p = new QScriptSyntaxCheckResultPrivate();
- switch (result.state) {
- case QScript::SyntaxChecker::Error:
- p->state = QScriptSyntaxCheckResult::Error;
- break;
- case QScript::SyntaxChecker::Intermediate:
- p->state = QScriptSyntaxCheckResult::Intermediate;
- break;
- case QScript::SyntaxChecker::Valid:
- p->state = QScriptSyntaxCheckResult::Valid;
- break;
- }
- p->errorLineNumber = result.errorLineNumber;
- p->errorColumnNumber = result.errorColumnNumber;
- p->errorMessage = result.errorMessage;
- return QScriptSyntaxCheckResult(p);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptengine_p.h b/src/script/qscriptengine_p.h
deleted file mode 100644
index 3d13628..0000000
--- a/src/script/qscriptengine_p.h
+++ /dev/null
@@ -1,828 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTENGINE_P_H
-#define QSCRIPTENGINE_P_H
-
-#include "qscriptenginefwd_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/QDateTime>
-#include <QtCore/QMutex>
-#include <QtCore/QLinkedList>
-#include <QtCore/QString>
-#include <QtCore/QVector>
-#include <QtCore/QHash>
-#include <QtCore/qnumeric.h>
-
-#include "qscriptengine.h"
-#include "qscriptnameid_p.h"
-#include "qscriptobjectfwd_p.h"
-#include "qscriptrepository_p.h"
-#include "qscriptgc_p.h"
-#include "qscriptecmaarray_p.h"
-#include "qscriptecmadate_p.h"
-#include "qscriptecmaobject_p.h"
-#include "qscriptecmaboolean_p.h"
-#include "qscriptecmanumber_p.h"
-#include "qscriptecmastring_p.h"
-#include "qscriptecmafunction_p.h"
-#include "qscriptextvariant_p.h"
-#include "qscriptextqobject_p.h"
-#include "qscriptvalue_p.h"
-#include "qscriptcontextfwd_p.h"
-
-#include <math.h>
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-namespace QScript {
-
-class ArgumentsObjectData: public QScriptObjectData
-{
-public:
- ArgumentsObjectData() : length(0) {}
- virtual ~ArgumentsObjectData() {}
-
-public: // attributes
- QScriptValueImpl activation;
- uint length;
-};
-
-} // namespace QScript
-
-inline QScriptEnginePrivate *QScriptEnginePrivate::get(QScriptEngine *q)
-{
- if (q)
- return q->d_func();
- return 0;
-}
-
-inline const QScriptEnginePrivate *QScriptEnginePrivate::get(const QScriptEngine *q)
-{
- if (q)
- return q->d_func();
- return 0;
-}
-
-inline QScriptEngine *QScriptEnginePrivate::get(QScriptEnginePrivate *d)
-{
- return d->q_func();
-}
-
-inline QString QScriptEnginePrivate::toString(QScriptNameIdImpl *id)
-{
- if (! id)
- return QString();
-
- return id->s;
-}
-
-inline QString QScriptEnginePrivate::memberName(const QScript::Member &member) const
-{
- return toString(member.nameId());
-}
-
-inline void QScriptEnginePrivate::newReference(QScriptValueImpl *o, int mode)
-{
- Q_ASSERT(o);
- o->m_type = QScript::ReferenceType;
- o->m_int_value = (mode);
-}
-
-inline void QScriptEnginePrivate::newActivation(QScriptValueImpl *o)
-{
- Q_ASSERT(o);
- newObject(o, nullValue(), m_class_activation);
-}
-
-inline void QScriptEnginePrivate::newPointer(QScriptValueImpl *o, void *ptr)
-{
- Q_ASSERT(o);
- o->m_type = QScript::PointerType;
- o->m_ptr_value = ptr;
-}
-
-inline void QScriptEnginePrivate::newInteger(QScriptValueImpl *o, int i)
-{
- Q_ASSERT(o);
- o->m_type = QScript::IntegerType;
- o->m_int_value = (i);
-}
-
-inline void QScriptEnginePrivate::newNameId(QScriptValueImpl *o, const QString &s)
-{
- Q_ASSERT(o);
- o->m_type = QScript::StringType;
- o->m_string_value = (nameId(s, /*persistent=*/false));
-}
-
-inline void QScriptEnginePrivate::newString(QScriptValueImpl *o, const QString &s)
-{
- Q_ASSERT(o);
- o->m_type = QScript::StringType;
- QScriptNameIdImpl *entry = new QScriptNameIdImpl(s);
- m_tempStringRepository.append(entry);
- o->m_string_value = (entry);
- m_newAllocatedTempStringRepositoryChars += s.length();
-}
-
-inline void QScriptEnginePrivate::newNameId(QScriptValueImpl *o, QScriptNameIdImpl *id)
-{
- Q_ASSERT(o);
- o->m_type = QScript::StringType;
- o->m_string_value = (id);
-}
-
-inline const QScript::IdTable *QScriptEnginePrivate::idTable() const
-{
- return &m_id_table;
-}
-
-inline qsreal QScriptEnginePrivate::convertToNativeDouble(const QScriptValueImpl &value)
-{
- Q_ASSERT (value.isValid());
-
- if (value.isNumber())
- return value.m_number_value;
-
- return convertToNativeDouble_helper(value);
-}
-
-inline qint32 QScriptEnginePrivate::convertToNativeInt32(const QScriptValueImpl &value)
-{
- Q_ASSERT (value.isValid());
-
- return toInt32 (convertToNativeDouble(value));
-}
-
-
-inline bool QScriptEnginePrivate::convertToNativeBoolean(const QScriptValueImpl &value)
-{
- Q_ASSERT (value.isValid());
-
- if (value.isBoolean())
- return value.m_bool_value;
-
- return convertToNativeBoolean_helper(value);
-}
-
-inline QString QScriptEnginePrivate::convertToNativeString(const QScriptValueImpl &value)
-{
- Q_ASSERT (value.isValid());
-
- if (value.isString())
- return value.m_string_value->s;
-
- return convertToNativeString_helper(value);
-}
-
-inline qsreal QScriptEnginePrivate::toInteger(qsreal n)
-{
- if (qIsNaN(n))
- return 0;
-
- if (n == 0 || qIsInf(n))
- return n;
-
- int sign = n < 0 ? -1 : 1;
- return sign * ::floor(::fabs(n));
-}
-
-inline qint32 QScriptEnginePrivate::toInt32(qsreal n)
-{
- if (qIsNaN(n) || qIsInf(n) || (n == 0))
- return 0;
-
- double sign = (n < 0) ? -1.0 : 1.0;
- qsreal abs_n = fabs(n);
-
- n = ::fmod(sign * ::floor(abs_n), D32);
- const double D31 = D32 / 2.0;
-
- if (sign == -1 && n < -D31)
- n += D32;
-
- else if (sign != -1 && n >= D31)
- n -= D32;
-
- return qint32 (n);
-}
-
-inline quint32 QScriptEnginePrivate::toUint32(qsreal n)
-{
- if (qIsNaN(n) || qIsInf(n) || (n == 0))
- return 0;
-
- double sign = (n < 0) ? -1.0 : 1.0;
- qsreal abs_n = fabs(n);
-
- n = ::fmod(sign * ::floor(abs_n), D32);
-
- if (n < 0)
- n += D32;
-
- return quint32 (n);
-}
-
-inline quint16 QScriptEnginePrivate::toUint16(qsreal n)
-{
- if (qIsNaN(n) || qIsInf(n) || (n == 0))
- return 0;
-
- double sign = (n < 0) ? -1.0 : 1.0;
- qsreal abs_n = fabs(n);
-
- n = ::fmod(sign * ::floor(abs_n), D16);
-
- if (n < 0)
- n += D16;
-
- return quint16 (n);
-}
-
-inline QScript::AST::Node *QScriptEnginePrivate::abstractSyntaxTree() const
-{
- return m_abstractSyntaxTree;
-}
-
-inline QScript::MemoryPool *QScriptEnginePrivate::nodePool()
-{
- return m_pool;
-}
-
-inline void QScriptEnginePrivate::setNodePool(QScript::MemoryPool *pool)
-{
- m_pool = pool;
-}
-
-inline QScript::Lexer *QScriptEnginePrivate::lexer()
-{
- return m_lexer;
-}
-
-inline void QScriptEnginePrivate::setLexer(QScript::Lexer *lexer)
-{
- m_lexer = lexer;
-}
-
-inline QScriptObject *QScriptEnginePrivate::allocObject()
-{
- return objectAllocator(m_objectGeneration);
-}
-
-inline QScriptContextPrivate *QScriptEnginePrivate::currentContext() const
-{
- return m_context;
-}
-
-inline QScriptContextPrivate *QScriptEnginePrivate::pushContext()
-{
- QScriptContext *context = m_frameRepository.get();
- QScriptContextPrivate *ctx_p = QScriptContextPrivate::get(context);
- ctx_p->init(m_context);
- m_context = ctx_p;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- notifyContextPush();
-#endif
- return m_context;
-}
-
-inline void QScriptEnginePrivate::popContext()
-{
- Q_ASSERT(m_context != 0);
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- notifyContextPop();
-#endif
- QScriptContextPrivate *context = m_context;
- m_context = context->parentContext();
- if (m_context) {
- QScriptContextPrivate *p1 = m_context;
- QScriptContextPrivate *p2 = context;
- if ((p1->m_state != QScriptContext::ExceptionState)
- || (p2->m_state == QScriptContext::ExceptionState)) {
- // propagate the state
- p1->m_result = p2->m_result;
- p1->m_state = p2->m_state;
- // only update errorLineNumber if there actually was an exception
- if (p2->m_state == QScriptContext::ExceptionState) {
- if (p2->errorLineNumber != -1)
- p1->errorLineNumber = p2->errorLineNumber;
- else
- p1->errorLineNumber = p1->currentLine;
- }
- }
- }
- m_frameRepository.release(QScriptContextPrivate::get(context));
-}
-
-inline void QScriptEnginePrivate::maybeGC()
-{
- if (objectAllocator.blocked())
- return;
-
- bool do_string_gc = ((m_stringRepository.size() - m_oldStringRepositorySize) > 256)
- || (m_newAllocatedStringRepositoryChars > 0x800000);
- do_string_gc |= ((m_tempStringRepository.size() - m_oldTempStringRepositorySize) > 1024)
- || (m_newAllocatedTempStringRepositoryChars > 0x800000);
-
- if (! do_string_gc && ! objectAllocator.poll())
- return;
-
- maybeGC_helper(do_string_gc);
-}
-
-inline void QScriptEnginePrivate::adjustBytesAllocated(int bytes)
-{
- objectAllocator.adjustBytesAllocated(bytes);
-}
-
-inline bool QScriptEnginePrivate::blockGC(bool block)
-{
- return objectAllocator.blockGC(block);
-}
-
-inline void QScriptEnginePrivate::markString(QScriptNameIdImpl *id, int /*generation*/)
-{
- id->used = true;
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::createFunction(QScriptFunction *fun)
-{
- QScriptValueImpl v;
- newFunction(&v, fun);
- return v;
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::newArray(const QScript::Array &value)
-{
- QScriptValueImpl v;
- newArray(&v, value);
- return v;
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::newArray(uint length)
-{
- QScriptValueImpl v;
- QScript::Array a(this);
- a.resize(length);
- newArray(&v, a);
- return v;
-}
-
-inline QScriptClassInfo *QScriptEnginePrivate::registerClass(const QString &pname, int type)
-{
- if (type == -1)
- type = ++m_class_prev_id;
-
- QScriptClassInfo *oc = new QScriptClassInfo(this, QScriptClassInfo::Type(type), pname);
- m_allocated_classes.append(oc);
-
- return oc;
-}
-
-inline QScriptClassInfo *QScriptEnginePrivate::registerClass(const QString &name)
-{
- return registerClass(name, -1);
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::createFunction(QScriptInternalFunctionSignature fun,
- int length, QScriptClassInfo *classInfo, const QString &name)
-{
- return createFunction(new QScript::C2Function(fun, length, classInfo, name));
-}
-
-inline void QScriptEnginePrivate::newFunction(QScriptValueImpl *o, QScriptFunction *function)
-{
- QScriptValueImpl proto;
- if (functionConstructor)
- proto = functionConstructor->publicPrototype;
- else {
- // creating the Function prototype object
- Q_ASSERT(objectConstructor);
- proto = objectConstructor->publicPrototype;
- }
- newObject(o, proto, m_class_function);
- o->setObjectData(function);
-}
-
-inline void QScriptEnginePrivate::newConstructor(QScriptValueImpl *ctor,
- QScriptFunction *function,
- QScriptValueImpl &proto)
-{
- newFunction(ctor, function);
- ctor->setProperty(m_id_table.id_prototype, proto,
- QScriptValue::Undeletable
- | QScriptValue::ReadOnly
- | QScriptValue::SkipInEnumeration);
- proto.setProperty(m_id_table.id_constructor, *ctor,
- QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration);
-}
-
-inline void QScriptEnginePrivate::newArguments(QScriptValueImpl *object,
- const QScriptValueImpl &activation,
- uint length,
- const QScriptValueImpl &callee)
-{
- QScript::ArgumentsObjectData *data = new QScript::ArgumentsObjectData();
- data->activation = activation;
- data->length = length;
- newObject(object, m_class_arguments);
- object->setObjectData(data);
- object->setProperty(m_id_table.id_callee, callee,
- QScriptValue::SkipInEnumeration);
- object->setProperty(m_id_table.id_length, QScriptValueImpl(length),
- QScriptValue::SkipInEnumeration);
-}
-
-inline QScriptFunction *QScriptEnginePrivate::convertToNativeFunction(const QScriptValueImpl &object)
-{
- if (object.isFunction())
- return static_cast<QScriptFunction*> (object.objectData());
- return 0;
-}
-
-inline QScriptValue QScriptEnginePrivate::toPublic(const QScriptValueImpl &value)
-{
- if (!value.isValid())
- return QScriptValue();
-
- QScriptValuePrivate *p = registerValue(value);
- QScriptValue v;
- QScriptValuePrivate::init(v, p);
- return v;
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::toImpl(const QScriptValue &value)
-{
- QScriptValuePrivate *p = QScriptValuePrivate::get(value);
- if (!p)
- return QScriptValueImpl();
- if (p->value.type() == QScript::LazyStringType)
- return toImpl_helper(value);
- return p->value;
-}
-
-inline QScriptValueImplList QScriptEnginePrivate::toImplList(const QScriptValueList &lst)
-{
- QScriptValueImplList result;
- QScriptValueList::const_iterator it;
- for (it = lst.constBegin(); it != lst.constEnd(); ++it)
- result.append(toImpl(*it));
- return result;
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::toObject(const QScriptValueImpl &value)
-{
- if (value.isObject() || !value.isValid())
- return value;
- return toObject_helper(value);
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::toPrimitive(const QScriptValueImpl &object,
- QScriptValueImpl::TypeHint hint)
-{
- Q_ASSERT(object.isValid());
-
- if (! object.isObject())
- return object;
-
- return toPrimitive_helper(object, hint);
-}
-
-inline QDateTime QScriptEnginePrivate::toDateTime(const QScriptValueImpl &value) const
-{
- return dateConstructor->toDateTime(value);
-}
-
-inline void QScriptEnginePrivate::newArray(QScriptValueImpl *object, const QScript::Array &value)
-{
- arrayConstructor->newArray(object, value);
-}
-
-inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o, const QScriptValueImpl &proto,
- QScriptClassInfo *oc)
-{
- Q_ASSERT(o != 0);
-
- QScriptObject *od = allocObject();
- od->reset();
- od->m_id = ++m_next_object_id;
- if (proto.isValid())
- od->m_prototype = proto;
- else {
- Q_ASSERT(objectConstructor);
- od->m_prototype = objectConstructor->publicPrototype;
- }
-
- o->m_type = QScript::ObjectType;
- od->m_class = (oc ? oc : m_class_object);
- o->m_object_value = od;
-}
-
-inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o, QScriptClassInfo *oc)
-{
- newObject(o, objectConstructor->publicPrototype, oc);
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::newObject()
-{
- QScriptValueImpl v;
- newObject(&v);
- return v;
-}
-
-inline void QScriptEnginePrivate::newVariant(QScriptValueImpl *out,
- const QVariant &value,
- bool setDefaultPrototype)
-{
- Q_ASSERT(variantConstructor != 0);
- variantConstructor->newVariant(out, value);
- if (setDefaultPrototype) {
- QScriptValueImpl proto = defaultPrototype(value.userType());
- if (proto.isValid())
- out->setPrototype(proto);
- }
-}
-
-#ifndef QT_NO_QOBJECT
-# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
-inline QScriptMetaObject *QScriptEnginePrivate::cachedMetaObject(const QMetaObject *meta)
-{
- QScriptMetaObject *value = m_cachedMetaObjects.value(meta);
- if (!value) {
- value = new QScriptMetaObject;
- m_cachedMetaObjects.insert(meta, value);
- }
- return value;
-}
-# endif
-#endif // !QT_NO_QOBJECT
-
-inline QScriptNameIdImpl *QScriptEnginePrivate::nameId(const QString &str, bool persistent)
-{
- QScriptNameIdImpl *entry = toStringEntry(str);
- if (! entry)
- entry = insertStringEntry(str);
-
- Q_ASSERT(entry->unique);
-
- if (persistent)
- entry->persistent = true;
-
- return entry;
-}
-
-inline QScriptNameIdImpl *QScriptEnginePrivate::intern(const QChar *u, int s)
-{
- QString tmp(u, s);
- return nameId(tmp, /*persistent=*/ true);
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::valueFromVariant(const QVariant &v)
-{
- QScriptValueImpl result = create(v.userType(), v.data());
- Q_ASSERT(result.isValid());
- return result;
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::undefinedValue()
-{
- return m_undefinedValue;
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::nullValue()
-{
- return m_nullValue;
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::defaultPrototype(int metaTypeId) const
-{
- QScriptCustomTypeInfo info = m_customTypes.value(metaTypeId);
- return info.prototype;
-}
-
-inline void QScriptEnginePrivate::setDefaultPrototype(int metaTypeId, const QScriptValueImpl &prototype)
-{
- QScriptCustomTypeInfo info = m_customTypes.value(metaTypeId);
- info.prototype = prototype;
- m_customTypes.insert(metaTypeId, info);
-}
-
-inline uint _q_scriptHash(const QString &key)
-{
- const QChar *p = key.unicode();
- int n = qMin(key.size(), 128);
- uint h = key.size();
- uint g;
-
- while (n--) {
- h = (h << 4) + (*p++).unicode();
- if ((g = (h & 0xf0000000)) != 0)
- h ^= g >> 23;
- h &= ~g;
- }
- return h;
-}
-
-inline QScriptNameIdImpl *QScriptEnginePrivate::toStringEntry(const QString &s)
-{
- uint h = _q_scriptHash(s) % m_string_hash_size;
-
- for (QScriptNameIdImpl *entry = m_string_hash_base[h]; entry && entry->h == h; entry = entry->next) {
- if (entry->s == s)
- return entry;
- }
-
- return 0;
-}
-
-inline bool QScriptEnginePrivate::lessThan(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs)
-{
- return QScriptContextPrivate::lt_cmp(lhs, rhs);
-}
-
-inline bool QScriptEnginePrivate::equals(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs)
-{
- return QScriptContextPrivate::eq_cmp(lhs, rhs);
-}
-
-inline bool QScriptEnginePrivate::strictlyEquals(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs)
-{
- return QScriptContextPrivate::strict_eq_cmp(lhs, rhs);
-}
-
-inline void QScriptEnginePrivate::unregisterValue(QScriptValuePrivate *p)
-{
- QScriptValueImpl &v = p->value;
- Q_ASSERT(v.isValid());
- if (v.isString()) {
- QScriptNameIdImpl *id = v.stringValue();
- m_stringHandles.remove(id);
- } else if (v.isObject()) {
- QScriptObject *instance = v.objectValue();
- m_objectHandles.remove(instance);
- } else {
- int i = m_otherHandles.indexOf(p);
- Q_ASSERT(i != -1);
- m_otherHandles.remove(i);
- }
- m_handleRepository.release(p);
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::globalObject() const
-{
- return m_globalObject;
-}
-
-inline bool QScriptEnginePrivate::hasUncaughtException() const
-{
- return (currentContext()->state() == QScriptContext::ExceptionState);
-}
-
-inline QScriptValueImpl QScriptEnginePrivate::uncaughtException() const
-{
- if (!hasUncaughtException())
- return QScriptValueImpl();
- return currentContext()->returnValue();
-}
-
-inline void QScriptEnginePrivate::maybeProcessEvents()
-{
- if (m_processEventsInterval > 0 && ++m_processEventIncr > 512) {
- m_processEventIncr = 0;
- processEvents();
- }
-}
-
-inline bool QScriptEnginePrivate::shouldAbort() const
-{
- return m_abort;
-}
-
-inline void QScriptEnginePrivate::resetAbortFlag()
-{
- m_abort = false;
-}
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
-
-inline bool QScriptEnginePrivate::shouldNotify() const
-{
- return m_agent != 0;
-}
-
-inline void QScriptEnginePrivate::notifyScriptLoad(
- qint64 id, const QString &program,
- const QString &fileName, int lineNumber)
-{
- if (shouldNotify())
- notifyScriptLoad_helper(id, program, fileName, lineNumber);
-}
-
-inline void QScriptEnginePrivate::notifyScriptUnload(qint64 id)
-{
- if (shouldNotify())
- notifyScriptUnload_helper(id);
-}
-
-inline void QScriptEnginePrivate::notifyPositionChange(QScriptContextPrivate *ctx)
-{
- Q_ASSERT(m_agent != 0);
- notifyPositionChange_helper(ctx);
-}
-
-inline void QScriptEnginePrivate::notifyContextPush()
-{
- if (shouldNotify())
- notifyContextPush_helper();
-}
-
-inline void QScriptEnginePrivate::notifyContextPop()
-{
- if (shouldNotify())
- notifyContextPop_helper();
-}
-
-inline void QScriptEnginePrivate::notifyFunctionEntry(QScriptContextPrivate *ctx)
-{
- if (shouldNotify())
- notifyFunctionEntry_helper(ctx);
-}
-
-inline void QScriptEnginePrivate::notifyFunctionExit(QScriptContextPrivate *ctx)
-{
- if (shouldNotify())
- notifyFunctionExit_helper(ctx);
-}
-
-inline void QScriptEnginePrivate::notifyException(QScriptContextPrivate *ctx)
-{
- if (shouldNotify())
- notifyException_helper(ctx);
-}
-
-inline void QScriptEnginePrivate::notifyExceptionCatch(QScriptContextPrivate *ctx)
-{
- if (shouldNotify())
- notifyExceptionCatch_helper(ctx);
-}
-
-#endif // Q_SCRIPT_NO_EVENT_NOTIFY
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptengineagent_p.h b/src/script/qscriptengineagent_p.h
deleted file mode 100644
index f0b3969..0000000
--- a/src/script/qscriptengineagent_p.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTENGINEAGENT_P_H
-#define QSCRIPTENGINEAGENT_P_H
-
-#include <QtCore/qobjectdefs.h>
-
-#ifndef QT_NO_SCRIPT
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-QT_BEGIN_NAMESPACE
-
-class QScriptEngine;
-
-class QScriptEngineAgent;
-class Q_SCRIPT_EXPORT QScriptEngineAgentPrivate
-{
- Q_DECLARE_PUBLIC(QScriptEngineAgent)
-public:
- QScriptEngineAgentPrivate();
- virtual ~QScriptEngineAgentPrivate();
-
- QScriptEngine *engine;
-
- QScriptEngineAgent *q_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptenginefwd_p.h b/src/script/qscriptenginefwd_p.h
deleted file mode 100644
index 855317c..0000000
--- a/src/script/qscriptenginefwd_p.h
+++ /dev/null
@@ -1,560 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTENGINEFWD_P_H
-#define QSCRIPTENGINEFWD_P_H
-
-#ifndef QT_NO_QOBJECT
-#include "private/qobject_p.h"
-#endif
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/qobjectdefs.h>
-
-#include <QtCore/QHash>
-#include <QtCore/QList>
-#include <QtCore/QRegExp>
-#include <QtCore/QSet>
-#include <QtCore/QStringList>
-#include <QtCore/QTime>
-#include <QtCore/QVector>
-
-#include "qscriptengine.h"
-#include "qscriptrepository_p.h"
-#include "qscriptgc_p.h"
-#include "qscriptobjectfwd_p.h"
-#include "qscriptclassinfo_p.h"
-#include "qscriptstring_p.h"
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptClass;
-class QScriptContext;
-
-namespace QScript {
-
-namespace AST {
- class Node;
-} // namespace AST
-
-namespace Ecma {
- class Object;
- class Number;
- class Boolean;
- class String;
- class Math;
- class Date;
- class Function;
- class Array;
- class RegExp;
- class Error;
-} // namespace Ecma
-
-namespace Ext {
- class Enumeration;
- class Variant;
-} // namespace Ext
-
-class ExtQObject;
-class ExtQMetaObject;
-
-class Array;
-class Lexer;
-class Code;
-class CompilationUnit;
-class IdTable;
-class MemoryPool;
-
-class IdTable
-{
-public:
- inline IdTable()
- : id_constructor(0), id_false(0), id_null(0),
- id_object(0), id_pointer(0), id_prototype(0),
- id_arguments(0), id_this(0), id_toString(0),
- id_true(0), id_undefined(0), id_valueOf(0),
- id_length(0), id_callee(0), id___proto__(0),
- id___qt_sender__(0)
- {}
-
- QScriptNameIdImpl *id_constructor;
- QScriptNameIdImpl *id_false;
- QScriptNameIdImpl *id_null;
- QScriptNameIdImpl *id_object;
- QScriptNameIdImpl *id_pointer;
- QScriptNameIdImpl *id_prototype;
- QScriptNameIdImpl *id_arguments;
- QScriptNameIdImpl *id_this;
- QScriptNameIdImpl *id_toString;
- QScriptNameIdImpl *id_true;
- QScriptNameIdImpl *id_undefined;
- QScriptNameIdImpl *id_valueOf;
- QScriptNameIdImpl *id_length;
- QScriptNameIdImpl *id_callee;
- QScriptNameIdImpl *id___proto__;
- QScriptNameIdImpl *id___qt_sender__;
-};
-
-} // namespace QScript
-
-#ifndef QT_NO_QOBJECT
-class QScriptQObjectData;
-class QScriptMetaObject;
-#endif
-
-class QScriptCustomTypeInfo
-{
-public:
- QScriptCustomTypeInfo() : signature(0, '\0'), marshal(0), demarshal(0)
- { prototype.invalidate(); }
-
- QByteArray signature;
- QScriptEngine::MarshalFunction marshal;
- QScriptEngine::DemarshalFunction demarshal;
- QScriptValueImpl prototype;
-};
-
-class QScriptEnginePrivate
-#ifndef QT_NO_QOBJECT
- : public QObjectPrivate
-#endif
-{
- Q_DECLARE_PUBLIC(QScriptEngine)
-
- enum {
- DefaultHashSize = 1021
- };
-
-public:
- QScriptEnginePrivate();
- virtual ~QScriptEnginePrivate();
-
- void init();
- void initStringRepository();
-
- static inline QScriptEnginePrivate *get(QScriptEngine *q);
- static inline const QScriptEnginePrivate *get(const QScriptEngine *q);
- static inline QScriptEngine *get(QScriptEnginePrivate *d);
-
- QScript::AST::Node *createAbstractSyntaxTree(
- const QString &source, int lineNumber,
- QString *errorMessage, int *errorLineNumber);
- QScript::AST::Node *changeAbstractSyntaxTree(QScript::AST::Node *program);
-
- inline QScript::AST::Node *abstractSyntaxTree() const;
- inline bool hasUncaughtException() const;
- inline QScriptValueImpl uncaughtException() const;
- QStringList uncaughtExceptionBacktrace() const;
- void clearExceptions();
-#ifndef QT_NO_QOBJECT
- void emitSignalHandlerException();
-#endif
-
- static bool canEvaluate(const QString &program);
- static QScriptSyntaxCheckResult checkSyntax(const QString &program);
-
- inline QScriptContextPrivate *currentContext() const;
- inline QScriptContextPrivate *pushContext();
- inline void popContext();
-
- inline QScript::MemoryPool *nodePool();
- inline QScript::Lexer *lexer();
- inline QScriptObject *allocObject();
-
- inline void maybeGC();
-
- void maybeGC_helper(bool do_string_gc);
-
- inline bool blockGC(bool block);
-
- void gc();
- bool isCollecting() const;
- void processMarkStack(int generation);
-
- inline void adjustBytesAllocated(int bytes);
-
- void markObject(const QScriptValueImpl &object, int generation);
- void markFrame(QScriptContextPrivate *context, int generation);
-
- inline void markString(QScriptNameIdImpl *id, int generation);
-
- inline QScriptValueImpl createFunction(QScriptFunction *fun);
- inline QScriptValueImpl newArray(const QScript::Array &value);
- inline QScriptValueImpl newArray(uint length = 0);
-
- void evaluate(QScriptContextPrivate *context, const QString &contents,
- int lineNumber, const QString &fileName = QString());
-
- inline void setLexer(QScript::Lexer *lexer);
-
- inline void setNodePool(QScript::MemoryPool *pool);
-
- inline QScriptClassInfo *registerClass(const QString &pname, int type);
-
- inline QScriptClassInfo *registerClass(const QString &name);
-
- int registerCustomClassType();
-
- inline QScriptValueImpl createFunction(QScriptInternalFunctionSignature fun,
- int length, QScriptClassInfo *classInfo,
- const QString &name = QString());
-
- static inline QString toString(QScriptNameIdImpl *id);
- inline QString memberName(const QScript::Member &member) const;
- inline void newReference(QScriptValueImpl *object, int mode);
- inline void newActivation(QScriptValueImpl *object);
- inline void newFunction(QScriptValueImpl *object, QScriptFunction *function);
- inline void newConstructor(QScriptValueImpl *ctor, QScriptFunction *function,
- QScriptValueImpl &proto);
- inline void newInteger(QScriptValueImpl *object, int i);
- inline void newPointer(QScriptValueImpl *object, void *ptr);
- inline void newNameId(QScriptValueImpl *object, const QString &s);
- inline void newNameId(QScriptValueImpl *object, QScriptNameIdImpl *id);
- inline void newString(QScriptValueImpl *object, const QString &s);
- inline void newArguments(QScriptValueImpl *object, const QScriptValueImpl &activation,
- uint length, const QScriptValueImpl &callee);
- static inline QString convertToNativeString(const QScriptValueImpl &value);
- static QString convertToNativeString_helper(const QScriptValueImpl &value);
- static inline qsreal convertToNativeDouble(const QScriptValueImpl &value);
- static qsreal convertToNativeDouble_helper(const QScriptValueImpl &value);
- static inline bool convertToNativeBoolean(const QScriptValueImpl &value);
- static bool convertToNativeBoolean_helper(const QScriptValueImpl &value);
- static inline qint32 convertToNativeInt32(const QScriptValueImpl &value);
- static inline QScriptFunction *convertToNativeFunction(const QScriptValueImpl &value);
-
- inline QScriptValue toPublic(const QScriptValueImpl &value);
- inline QScriptValueImpl toImpl(const QScriptValue &value);
- QScriptValueImpl toImpl_helper(const QScriptValue &value);
- inline QScriptValueImplList toImplList(const QScriptValueList &lst);
-
- inline const QScript::IdTable *idTable() const;
-
- inline QScriptValueImpl toObject(const QScriptValueImpl &value);
- QScriptValueImpl toObject_helper(const QScriptValueImpl &value);
-
- inline QScriptValueImpl toPrimitive(const QScriptValueImpl &object,
- QScriptValueImpl::TypeHint hint = QScriptValueImpl::NoTypeHint);
- QScriptValueImpl toPrimitive_helper(const QScriptValueImpl &object,
- QScriptValueImpl::TypeHint hint);
-
- static const qsreal D16;
- static const qsreal D32;
-
- inline static qsreal toInteger(qsreal n);
- inline static qint32 toInt32(qsreal m);
- inline static quint32 toUint32(qsreal n);
- inline static quint16 toUint16(qsreal n);
-
- inline QDateTime toDateTime(const QScriptValueImpl &value) const;
-
- inline void newArray(QScriptValueImpl *object, const QScript::Array &value);
-
- inline void newObject(QScriptValueImpl *o, const QScriptValueImpl &proto,
- QScriptClassInfo *oc = 0);
- inline void newObject(QScriptValueImpl *o, QScriptClassInfo *oc = 0);
- QScriptValueImpl newObject(QScriptClass *scriptClass, const QScriptValueImpl &data);
-
- inline QScriptValueImpl newObject();
-
- inline void newVariant(QScriptValueImpl *out, const QVariant &value,
- bool setDefaultPrototype = true);
-
-#ifndef QT_NO_QOBJECT
- void newQObject(QScriptValueImpl *out, QObject *object,
- QScriptEngine::ValueOwnership ownership = QScriptEngine::QtOwnership,
- const QScriptEngine::QObjectWrapOptions &options = 0,
- bool setDefaultPrototype = true);
-
-# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- inline QScriptMetaObject *cachedMetaObject(const QMetaObject *meta);
-# endif
-#endif
-
- inline QScriptNameIdImpl *nameId(const QString &str, bool persistent = false);
-
- inline QScriptNameIdImpl *intern(const QChar *u, int s);
-
- QScriptString internedString(const QString &str);
- QScriptString internedString(QScriptNameIdImpl *nid);
- void uninternString(QScriptStringPrivate *d);
-
- inline QScriptValueImpl valueFromVariant(const QVariant &v);
-
- inline QScriptValueImpl undefinedValue();
-
- inline QScriptValueImpl nullValue();
-
- inline QScriptValueImpl defaultPrototype(int metaTypeId) const;
-
- inline void setDefaultPrototype(int metaTypeId, const QScriptValueImpl &prototype);
-
- QScriptValueImpl call(const QScriptValueImpl &callee, const QScriptValueImpl &thisObject,
- const QScriptValueImplList &args, bool asConstructor);
- QScriptValueImpl call(const QScriptValueImpl &callee, const QScriptValueImpl &thisObject,
- const QScriptValueImpl &args, bool asConstructor);
-
- void rehashStringRepository(bool resize = true);
- inline QScriptNameIdImpl *toStringEntry(const QString &s);
- QScriptNameIdImpl *insertStringEntry(const QString &s);
-
- QScriptValueImpl create(int type, const void *ptr);
- static bool convert(const QScriptValueImpl &value, int type, void *ptr,
- QScriptEnginePrivate *eng);
- QScriptEngine::DemarshalFunction demarshalFunction(int type) const;
-
- QScriptValueImpl arrayFromStringList(const QStringList &lst);
- static QStringList stringListFromArray(const QScriptValueImpl &arr);
-
- QScriptValueImpl arrayFromVariantList(const QVariantList &lst);
- static QVariantList variantListFromArray(const QScriptValueImpl &arr);
-
- QScriptValueImpl objectFromVariantMap(const QVariantMap &vmap);
- static QVariantMap variantMapFromObject(const QScriptValueImpl &obj);
-
- static inline bool lessThan(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs);
- static inline bool equals(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs);
- static inline bool strictlyEquals(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs);
-
- QScriptValuePrivate *registerValue(const QScriptValueImpl &value);
- inline void unregisterValue(QScriptValuePrivate *p);
-
- inline QScriptValueImpl globalObject() const;
-
- QScriptValueImpl objectById(qint64 id) const;
-
- QScriptValueImpl importExtension(const QString &extension);
- QStringList availableExtensions() const;
- QStringList importedExtensions() const;
-
- inline void maybeProcessEvents();
- void setupProcessEvents();
- void processEvents();
-
-#ifndef QT_NO_QOBJECT
- QScriptQObjectData *qobjectData(QObject *object);
-
- bool scriptConnect(QObject *sender, const char *signal,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function);
- bool scriptDisconnect(QObject *sender, const char *signal,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function);
-
- bool scriptConnect(QObject *sender, int index,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function,
- const QScriptValueImpl &senderWrapper = QScriptValueImpl());
- bool scriptDisconnect(QObject *sender, int index,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function);
-
- bool scriptConnect(const QScriptValueImpl &signal,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function);
- bool scriptDisconnect(const QScriptValueImpl &signal,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &function);
-
- void _q_objectDestroyed(QObject *object);
-
- void disposeQObject(QObject *object);
- void deletePendingQObjects();
-
- static bool convertToNativeQObject(const QScriptValueImpl &value,
- const QByteArray &targetType,
- void **result);
-#endif
-
- void abortEvaluation(const QScriptValueImpl &result);
- inline bool shouldAbort() const;
- inline void resetAbortFlag();
-
- void setAgent(QScriptEngineAgent *agent);
- QScriptEngineAgent *agent() const;
-
- void agentDeleted(QScriptEngineAgent *agent);
-
- void installTranslatorFunctions(QScriptValueImpl &object);
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- qint64 nextScriptId();
- inline bool shouldNotify() const;
- inline void notifyScriptLoad(qint64 id, const QString &program,
- const QString &fileName, int lineNumber);
- void notifyScriptLoad_helper(qint64 id, const QString &program,
- const QString &fileName, int lineNumber);
- inline void notifyScriptUnload(qint64 id);
- void notifyScriptUnload_helper(qint64 id);
- inline void notifyPositionChange(QScriptContextPrivate *ctx);
- void notifyPositionChange_helper(QScriptContextPrivate *ctx);
- inline void notifyContextPush();
- void notifyContextPush_helper();
- inline void notifyContextPop();
- void notifyContextPop_helper();
- inline void notifyFunctionEntry(QScriptContextPrivate *ctx);
- void notifyFunctionEntry_helper(QScriptContextPrivate *ctx);
- inline void notifyFunctionExit(QScriptContextPrivate *ctx);
- void notifyFunctionExit_helper(QScriptContextPrivate *ctx);
- inline void notifyException(QScriptContextPrivate *ctx);
- void notifyException_helper(QScriptContextPrivate *ctx);
- inline void notifyExceptionCatch(QScriptContextPrivate *ctx);
- void notifyExceptionCatch_helper(QScriptContextPrivate *ctx);
- void notifyDebugger(QScriptContextPrivate *ctx);
-#endif // Q_SCRIPT_NO_EVENT_NOTIFY
-
-public: // attributes
- bool m_evaluating;
- bool m_abort;
- int m_callDepth;
- int m_maxCallDepth;
- int m_gc_depth;
- QList<QScriptValueImpl> m_markStack;
- QScriptValueImpl m_globalObject;
- int m_oldStringRepositorySize;
- int m_oldTempStringRepositorySize;
- QVector<QScriptNameIdImpl*> m_stringRepository;
- int m_newAllocatedStringRepositoryChars;
- QVector<QScriptNameIdImpl*> m_tempStringRepository;
- int m_newAllocatedTempStringRepositoryChars;
- QScriptNameIdImpl **m_string_hash_base;
- int m_string_hash_size;
- QScript::GCAlloc<QScriptObject> objectAllocator;
- int m_objectGeneration;
- QScript::Repository<QScriptContext, QScriptContextPrivate> m_frameRepository;
- QScriptContextPrivate *m_context;
- QScriptValueImpl *tempStackBegin;
- QScriptValueImpl *tempStackEnd;
- QScript::AST::Node *m_abstractSyntaxTree;
- QScript::Lexer *m_lexer;
- QScript::MemoryPool *m_pool;
- QStringList m_exceptionBacktrace;
- qint64 m_scriptCounter;
-
- QScriptValueImpl m_undefinedValue;
- QScriptValueImpl m_nullValue;
-
- QScript::Ecma::Object *objectConstructor;
- QScript::Ecma::Number *numberConstructor;
- QScript::Ecma::Boolean *booleanConstructor;
- QScript::Ecma::String *stringConstructor;
- QScript::Ecma::Date *dateConstructor;
- QScript::Ecma::Function *functionConstructor;
- QScript::Ecma::Array *arrayConstructor;
- QScript::Ecma::RegExp *regexpConstructor;
- QScript::Ecma::Error *errorConstructor;
- QScript::Ext::Enumeration *enumerationConstructor;
- QScript::Ext::Variant *variantConstructor;
- QScript::ExtQObject *qobjectConstructor;
- QScript::ExtQMetaObject *qmetaObjectConstructor;
-
- QHash<int, QScriptCustomTypeInfo> m_customTypes;
-
- QScriptFunction *m_evalFunction;
-
- QList<QScriptClassInfo*> m_allocated_classes;
- QScriptClassInfo *m_class_object;
- QScriptClassInfo *m_class_function;
- QScriptClassInfo *m_class_with;
- QScriptClassInfo *m_class_arguments;
- QScriptClassInfo *m_class_activation;
-
- int m_class_prev_id;
- qint64 m_next_object_id;
-
- QScript::Repository<QScriptValuePrivate, QScriptValuePrivate> m_handleRepository;
- QHash<QScriptObject*, QScriptValuePrivate*> m_objectHandles;
- QHash<QScriptNameIdImpl*, QScriptValuePrivate*> m_stringHandles;
- QVector<QScriptValuePrivate*> m_otherHandles;
-
- QScript::Repository<QScriptStringPrivate,
- QScriptStringPrivate> m_internedStringRepository;
- QHash<QScriptNameIdImpl*, QScriptStringPrivate*> m_internedStrings;
-
- QSet<QScriptObject*> visitedArrayElements;
-
-#ifndef QT_NO_REGEXP
- QHash<QString, QRegExp> m_regExpLiterals;
-#endif
-
- QScript::IdTable m_id_table;
-
- QSet<QString> m_importedExtensions;
- QSet<QString> m_extensionsBeingImported;
-
- int m_processEventsInterval;
- int m_nextProcessEvents;
- int m_processEventIncr;
- QTime m_processEventTracker;
-
- QList<QScriptEngineAgent*> m_agents;
- QScriptEngineAgent *m_agent;
-
-#ifndef QT_NO_QOBJECT
- QList<QObject*> m_qobjectsToBeDeleted;
- QHash<QObject*, QScriptQObjectData*> m_qobjectData;
-
-# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- QHash<const QMetaObject*, QScriptMetaObject*> m_cachedMetaObjects;
-# endif
-#endif
-
-#ifdef QT_NO_QOBJECT
- QScriptEngine *q_ptr;
-#endif
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptextensioninterface.h b/src/script/qscriptextensioninterface.h
deleted file mode 100644
index 35dc7ed..0000000
--- a/src/script/qscriptextensioninterface.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTEXTENSIONINTERFACE_H
-#define QSCRIPTEXTENSIONINTERFACE_H
-
-#include <QtCore/qfactoryinterface.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/qobject.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Script)
-
-class QScriptEngine;
-
-struct Q_SCRIPT_EXPORT QScriptExtensionInterface
- : public QFactoryInterface
-{
- virtual void initialize(const QString &key, QScriptEngine *engine) = 0;
-};
-
-Q_DECLARE_INTERFACE(QScriptExtensionInterface,
- "com.trolltech.Qt.QScriptExtensionInterface/1.0")
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTEXTENSIONINTERFACE_H
diff --git a/src/script/qscriptextensionplugin.h b/src/script/qscriptextensionplugin.h
deleted file mode 100644
index e646b54..0000000
--- a/src/script/qscriptextensionplugin.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTEXTENSIONPLUGIN_H
-#define QSCRIPTEXTENSIONPLUGIN_H
-
-#include <QtCore/qplugin.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtScript/qscriptextensioninterface.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Script)
-
-class QScriptValue;
-
-class Q_SCRIPT_EXPORT QScriptExtensionPlugin : public QObject,
- public QScriptExtensionInterface
-{
- Q_OBJECT
- Q_INTERFACES(QScriptExtensionInterface:QFactoryInterface)
-public:
- explicit QScriptExtensionPlugin(QObject *parent = 0);
- ~QScriptExtensionPlugin();
-
- virtual QStringList keys() const = 0;
- virtual void initialize(const QString &key, QScriptEngine *engine) = 0;
-
- QScriptValue setupPackage(const QString &key, QScriptEngine *engine) const;
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTEXTENSIONPLUGIN_H
diff --git a/src/script/qscriptextenumeration.cpp b/src/script/qscriptextenumeration.cpp
deleted file mode 100644
index 4b043a9..0000000
--- a/src/script/qscriptextenumeration.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptextenumeration_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptvalueiteratorimpl_p.h"
-
-#include <QtCore/QtDebug>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ext {
-
-EnumerationClassData::EnumerationClassData(QScriptClassInfo *classInfo):
- m_classInfo(classInfo)
-{
-}
-
-EnumerationClassData::~EnumerationClassData()
-{
-}
-
-void EnumerationClassData::mark(const QScriptValueImpl &object, int generation)
-{
- Q_ASSERT(object.isValid());
-
- QScriptEnginePrivate *eng = object.engine();
-
- if (Enumeration::Instance *instance = Enumeration::Instance::get(object, classInfo())) {
- eng->markObject(instance->object, generation);
- if (instance->it)
- eng->markObject(instance->it->object(), generation);
- }
-}
-
-Enumeration::Enumeration(QScriptEnginePrivate *eng):
- Ecma::Core(eng, QLatin1String("Enumeration"), QScriptClassInfo::EnumerationType)
-{
- classInfo()->setData(new EnumerationClassData(classInfo()));
-
- newEnumeration(&publicPrototype, eng->newArray());
-
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("toFront"), method_toFront, 0);
- addPrototypeFunction(QLatin1String("hasNext"), method_hasNext, 0);
- addPrototypeFunction(QLatin1String("next"), method_next, 0);
-}
-
-Enumeration::~Enumeration()
-{
-}
-
-Enumeration::Instance *Enumeration::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass)
-{
- if (! klass || klass == object.classInfo())
- return static_cast<Instance*> (object.objectData());
-
- return 0;
-}
-
-void Enumeration::execute(QScriptContextPrivate *context)
-{
- if (context->argumentCount() > 0) {
- newEnumeration(&context->m_result, context->argument(0));
- } else {
- context->throwError(QScriptContext::TypeError,
- QLatin1String("Enumeration.execute"));
- }
-}
-
-void Enumeration::newEnumeration(QScriptValueImpl *result, const QScriptValueImpl &object)
-{
- Instance *instance = new Instance();
- instance->object = object;
- if (object.isObject()) {
- instance->it = new QScriptValueIteratorImpl(object);
- instance->it->setIgnoresDontEnum(false);
- instance->it->setEnumeratePrototype(true);
- } else {
- instance->it = 0;
- }
- engine()->newObject(result, publicPrototype, classInfo());
- result->setObjectData(instance);
-}
-
-QScriptValueImpl Enumeration::method_toFront(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- if (Instance *instance = Instance::get(context->thisObject(), classInfo)) {
- if (instance->it)
- instance->it->toFront();
- return eng->undefinedValue();
- } else {
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("Enumeration.toFront"));
- }
-}
-
-QScriptValueImpl Enumeration::method_hasNext(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- Instance *instance = Instance::get(context->thisObject(), classInfo);
- if (!instance) {
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("Enumeration.hasNext"));
- }
-
- QScriptValueImpl v;
- instance->hasNext(context, &v);
- return v;
-}
-
-QScriptValueImpl Enumeration::method_next(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo)
-{
- Instance *instance = Instance::get(context->thisObject(), classInfo);
- if (!instance) {
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("Enumeration.next"));
- }
-
- QScriptValueImpl v;
- instance->next(context, &v);
- return v;
-}
-
-Enumeration::Instance::~Instance()
-{
- if (it) {
- delete it;
- it = 0;
- }
-}
-
-void Enumeration::Instance::toFront()
-{
- if (it)
- it->toFront();
-}
-
-void Enumeration::Instance::hasNext(QScriptContextPrivate *, QScriptValueImpl *result)
-{
- *result = QScriptValueImpl(it && it->hasNext());
-}
-
-void Enumeration::Instance::next(QScriptContextPrivate *context, QScriptValueImpl *result)
-{
- QScriptEnginePrivate *eng = context->engine();
- Q_ASSERT(it != 0);
- it->next();
- QScript::Member *member = it->member();
- if (member->isObjectProperty() || member->nameId())
- eng->newNameId(result, member->nameId());
-
- else if (member->isNativeProperty() && !member->nameId())
- *result = QScriptValueImpl(uint(member->id()));
-
- else
- *result = eng->undefinedValue();
-}
-
-} } // namespace QScript::Ext
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptextenumeration_p.h b/src/script/qscriptextenumeration_p.h
deleted file mode 100644
index 4c49f74..0000000
--- a/src/script/qscriptextenumeration_p.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTEXTENUMERATION_P_H
-#define QSCRIPTEXTENUMERATION_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptecmacore_p.h"
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SCRIPT
-
-class QScriptValueIteratorImpl;
-
-namespace QScript { namespace Ext {
-
-class EnumerationClassData: public QScriptClassData
-{
- QScriptClassInfo *m_classInfo;
-
-public:
- EnumerationClassData(QScriptClassInfo *classInfo);
- virtual ~EnumerationClassData();
-
- inline QScriptClassInfo *classInfo() const
- { return m_classInfo; }
-
- virtual void mark(const QScriptValueImpl &object, int generation);
-};
-
-class Enumeration: public QScript::Ecma::Core
-{
-public:
- Enumeration(QScriptEnginePrivate *engine);
- virtual ~Enumeration();
-
- virtual void execute(QScriptContextPrivate *context);
-
- class Instance: public QScriptObjectData {
- public:
- Instance() : it(0) {}
- virtual ~Instance();
-
- static Instance *get(const QScriptValueImpl &object,
- QScriptClassInfo *klass);
-
- void toFront();
- void hasNext(QScriptContextPrivate *context, QScriptValueImpl *result);
- void next(QScriptContextPrivate *context, QScriptValueImpl *result);
-
- public: // attributes
- QScriptValueIteratorImpl *it;
- QScriptValueImpl object;
- };
-
- void newEnumeration(QScriptValueImpl *result, const QScriptValueImpl &value);
-
- inline Instance *get(const QScriptValueImpl &object) const
- {
- return Instance::get(object, classInfo());
- }
-
-protected:
- static QScriptValueImpl method_toFront(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_hasNext(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_next(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-};
-
-} } // namespace QScript::Ext
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif
diff --git a/src/script/qscriptextqobject.cpp b/src/script/qscriptextqobject.cpp
deleted file mode 100644
index 47c04d4..0000000
--- a/src/script/qscriptextqobject.cpp
+++ /dev/null
@@ -1,2241 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptable.h"
-#include "qscriptable_p.h"
-#include "qscriptextqobject_p.h"
-
-#include <QtCore/QtDebug>
-#include <QtCore/QMetaMethod>
-#include <QtCore/QRegExp>
-#include <QtCore/QVarLengthArray>
-#include <QtCore/QPointer>
-
-QT_BEGIN_NAMESPACE
-
-// we use bits 15..12 of property flags
-enum {
- PROPERTY_ID = 0 << 12,
- DYNAPROPERTY_ID = 1 << 12,
- METHOD_ID = 2 << 12,
- CHILD_ID = 3 << 12,
- ID_MASK = 7 << 12,
- MAYBE_OVERLOADED = 8 << 12
-};
-
-static const bool GeneratePropertyFunctions = true;
-
-int QScriptMetaType::typeId() const
-{
- if (isVariant())
- return QMetaType::type("QVariant");
- return isMetaEnum() ? 2/*int*/ : m_typeId;
-}
-
-QByteArray QScriptMetaType::name() const
-{
- if (!m_name.isEmpty())
- return m_name;
- else if (m_kind == Variant)
- return "QVariant";
- return QMetaType::typeName(typeId());
-}
-
-namespace QScript {
-
-class QObjectNotifyCaller : public QObject
-{
-public:
- void callConnectNotify(const char *signal)
- { connectNotify(signal); }
- void callDisconnectNotify(const char *signal)
- { disconnectNotify(signal); }
-};
-
-class QtPropertyFunction: public QScriptFunction
-{
-public:
- QtPropertyFunction(const QMetaObject *meta, int index)
- : m_meta(meta), m_index(index)
- { }
-
- ~QtPropertyFunction() { }
-
- virtual void execute(QScriptContextPrivate *context);
-
- virtual Type type() const { return QScriptFunction::QtProperty; }
-
- virtual QString functionName() const;
-
-private:
- const QMetaObject *m_meta;
- int m_index;
-};
-
-class QObjectPrototype : public QObject
-{
- Q_OBJECT
-public:
- QObjectPrototype(QObject *parent = 0)
- : QObject(parent) { }
- ~QObjectPrototype() { }
-};
-
-static inline QByteArray methodName(const QMetaMethod &method)
-{
- QByteArray signature = method.signature();
- return signature.left(signature.indexOf('('));
-}
-
-static inline QVariant variantFromValue(QScriptEnginePrivate *eng,
- int targetType, const QScriptValueImpl &value)
-{
- QVariant v(targetType, (void *)0);
- Q_ASSERT(eng);
- if (QScriptEnginePrivate::convert(value, targetType, v.data(), eng))
- return v;
- if (uint(targetType) == QVariant::LastType)
- return value.toVariant();
- if (value.isVariant()) {
- v = value.toVariant();
- if (v.canConvert(QVariant::Type(targetType))) {
- v.convert(QVariant::Type(targetType));
- return v;
- }
- QByteArray typeName = v.typeName();
- if (typeName.endsWith('*')
- && (QMetaType::type(typeName.left(typeName.size()-1)) == targetType)) {
- return QVariant(targetType, *reinterpret_cast<void* *>(v.data()));
- }
- }
-
- return QVariant();
-}
-
-void ExtQObject::Instance::finalize(QScriptEnginePrivate *eng)
-{
- switch (ownership) {
- case QScriptEngine::QtOwnership:
- break;
- case QScriptEngine::ScriptOwnership:
- if (value)
- eng->disposeQObject(value);
- break;
- case QScriptEngine::AutoOwnership:
- if (value && !value->parent())
- eng->disposeQObject(value);
- break;
- }
-}
-
-ExtQObject::Instance *ExtQObject::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass)
-{
- if (! klass || klass == object.classInfo())
- return static_cast<Instance*> (object.objectData());
-
- return 0;
-}
-
-
-static inline QScriptable *scriptableFromQObject(QObject *qobj)
-{
- void *ptr = qobj->qt_metacast("QScriptable");
- return reinterpret_cast<QScriptable*>(ptr);
-}
-
-static bool isObjectProperty(const QScriptValueImpl &object, const char *name)
-{
- QScriptEnginePrivate *eng = object.engine();
- QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(name));
- QScript::Member member;
- QScriptValueImpl base;
- return object.resolve(nameId, &member, &base, QScriptValue::ResolveLocal, QScript::Read)
- && member.testFlags(QScript::Member::ObjectProperty);
-}
-
-static bool hasMethodAccess(const QMetaMethod &method, int index, const QScriptEngine::QObjectWrapOptions &opt)
-{
- return (method.access() != QMetaMethod::Private)
- && ((index != 2) || !(opt & QScriptEngine::ExcludeDeleteLater));
-}
-
-static bool isEnumerableMetaProperty(const QMetaProperty &prop,
- const QMetaObject *mo, int index)
-{
- return prop.isScriptable() && prop.isValid()
- // the following lookup is to ensure that we have the
- // "most derived" occurrence of the property with this name
- && (mo->indexOfProperty(prop.name()) == index);
-}
-
-static uint flagsForMetaProperty(const QMetaProperty &prop)
-{
- return (QScriptValue::Undeletable
- | (!prop.isWritable()
- ? QScriptValue::ReadOnly
- : QScriptValue::PropertyFlag(0))
- | (GeneratePropertyFunctions
- ? (QScriptValue::PropertyGetter
- | QScriptValue::PropertySetter)
- : QScriptValue::PropertyFlag(0))
- | QScriptValue::QObjectMember
- | PROPERTY_ID);
-}
-
-
-static int indexOfMetaEnum(const QMetaObject *meta, const QByteArray &str)
-{
- QByteArray scope;
- QByteArray name;
- int scopeIdx = str.lastIndexOf("::");
- if (scopeIdx != -1) {
- scope = str.left(scopeIdx);
- name = str.mid(scopeIdx + 2);
- } else {
- name = str;
- }
- for (int i = meta->enumeratorCount() - 1; i >= 0; --i) {
- QMetaEnum m = meta->enumerator(i);
- if ((m.name() == name) && (scope.isEmpty() || (m.scope() == scope)))
- return i;
- }
- return -1;
-}
-
-static QMetaMethod metaMethod(const QMetaObject *meta,
- QMetaMethod::MethodType type,
- int index)
-{
- if (type != QMetaMethod::Constructor)
- return meta->method(index);
- else
- return meta->constructor(index);
-}
-
-static void callQtMethod(QScriptContextPrivate *context, QMetaMethod::MethodType callType,
- QObject *thisQObject, const QMetaObject *meta, int initialIndex,
- bool maybeOverloaded)
-{
- QScriptValueImpl result;
- QScriptEnginePrivate *engine = context->engine();
-
- int limit;
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- int lastFoundIndex = initialIndex;
- QScriptMetaObject *metaCache = engine->cachedMetaObject(meta);
- if (callType != QMetaMethod::Constructor)
- limit = metaCache->methodLowerBound(initialIndex);
- else
- limit = 0;
-#else
- limit = 0;
-#endif
-
- QByteArray funName;
- QScriptMetaMethod chosenMethod;
- int chosenIndex = -1;
- QVarLengthArray<QVariant, 9> args;
- QVector<QScriptMetaArguments> candidates;
- QVector<QScriptMetaArguments> unresolved;
- QVector<int> tooFewArgs;
- QVector<int> conversionFailed;
- int index;
- for (index = initialIndex; index >= limit; --index) {
- QScriptMetaMethod mtd;
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- if (callType != QMetaMethod::Constructor)
- mtd = metaCache->findMethod(index);
- if (!mtd.isValid())
-#endif
- {
- QMetaMethod method = metaMethod(meta, callType, index);
-
- QVector<QScriptMetaType> types;
- // resolve return type
- QByteArray returnTypeName = method.typeName();
- int rtype = QMetaType::type(returnTypeName);
- if ((rtype == 0) && !returnTypeName.isEmpty()) {
- if (returnTypeName == "QVariant") {
- types.append(QScriptMetaType::variant());
- } else {
- int enumIndex = indexOfMetaEnum(meta, returnTypeName);
- if (enumIndex != -1)
- types.append(QScriptMetaType::metaEnum(enumIndex, returnTypeName));
- else
- types.append(QScriptMetaType::unresolved(returnTypeName));
- }
- } else {
- if (callType == QMetaMethod::Constructor)
- types.append(QScriptMetaType::metaType(QMetaType::QObjectStar, "QObject*"));
- else if (returnTypeName == "QVariant")
- types.append(QScriptMetaType::variant());
- else
- types.append(QScriptMetaType::metaType(rtype, returnTypeName));
- }
- // resolve argument types
- QList<QByteArray> parameterTypeNames = method.parameterTypes();
- for (int i = 0; i < parameterTypeNames.count(); ++i) {
- QByteArray argTypeName = parameterTypeNames.at(i);
- int atype = QMetaType::type(argTypeName);
- if (atype == 0) {
- if (argTypeName == "QVariant") {
- types.append(QScriptMetaType::variant());
- } else {
- int enumIndex = indexOfMetaEnum(meta, argTypeName);
- if (enumIndex != -1)
- types.append(QScriptMetaType::metaEnum(enumIndex, argTypeName));
- else
- types.append(QScriptMetaType::unresolved(argTypeName));
- }
- } else {
- if (argTypeName == "QVariant")
- types.append(QScriptMetaType::variant());
- else
- types.append(QScriptMetaType::metaType(atype, argTypeName));
- }
- }
-
- mtd = QScriptMetaMethod(methodName(method), types);
-
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- if (mtd.fullyResolved() && (callType != QMetaMethod::Constructor))
- metaCache->registerMethod(index, mtd);
-#endif
- }
-
- if (index == initialIndex)
- funName = mtd.name();
- else {
- if (mtd.name() != funName)
- continue;
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- lastFoundIndex = index;
-#endif
- }
-
- if (context->argumentCount() < mtd.argumentCount()) {
- tooFewArgs.append(index);
- continue;
- }
-
- if (!mtd.fullyResolved()) {
- // remember it so we can give an error message later, if necessary
- unresolved.append(QScriptMetaArguments(/*matchDistance=*/INT_MAX, index,
- mtd, QVarLengthArray<QVariant, 9>()));
- if (mtd.hasUnresolvedReturnType())
- continue;
- }
-
- if (args.count() != mtd.count())
- args.resize(mtd.count());
-
- QScriptMetaType retType = mtd.returnType();
- args[0] = QVariant(retType.typeId(), (void *)0); // the result
-
- // try to convert arguments
- bool converted = true;
- int matchDistance = 0;
- for (int i = 0; converted && i < mtd.argumentCount(); ++i) {
- QScriptValueImpl actual = context->argument(i);
- QScriptMetaType argType = mtd.argumentType(i);
- int tid = -1;
- QVariant v;
- if (argType.isUnresolved()) {
- v = QVariant(QMetaType::QObjectStar, (void *)0);
- converted = engine->convertToNativeQObject(
- actual, argType.name(), reinterpret_cast<void* *>(v.data()));
- } else if (argType.isVariant()) {
- if (actual.isVariant()) {
- v = actual.variantValue();
- } else {
- v = actual.toVariant();
- converted = v.isValid() || actual.isUndefined() || actual.isNull();
- }
- } else {
- tid = argType.typeId();
- v = QVariant(tid, (void *)0);
- converted = QScriptEnginePrivate::convert(actual, tid, v.data(), engine);
- if (engine->hasUncaughtException())
- return;
- }
-
- if (!converted) {
- if (actual.isVariant()) {
- if (tid == -1)
- tid = argType.typeId();
- QVariant &vv = actual.variantValue();
- if (vv.canConvert(QVariant::Type(tid))) {
- v = vv;
- converted = v.convert(QVariant::Type(tid));
- if (converted && (vv.userType() != tid))
- matchDistance += 10;
- } else {
- QByteArray vvTypeName = vv.typeName();
- if (vvTypeName.endsWith('*')
- && (vvTypeName.left(vvTypeName.size()-1) == argType.name())) {
- v = QVariant(tid, *reinterpret_cast<void* *>(vv.data()));
- converted = true;
- matchDistance += 10;
- }
- }
- } else if (actual.isNumber() || actual.isString()) {
- // see if it's an enum value
- QMetaEnum m;
- if (argType.isMetaEnum()) {
- m = meta->enumerator(argType.enumeratorIndex());
- } else {
- int mi = indexOfMetaEnum(meta, argType.name());
- if (mi != -1)
- m = meta->enumerator(mi);
- }
- if (m.isValid()) {
- if (actual.isNumber()) {
- int ival = actual.toInt32();
- if (m.valueToKey(ival) != 0) {
- qVariantSetValue(v, ival);
- converted = true;
- matchDistance += 10;
- }
- } else {
- QString sval = actual.toString();
- int ival = m.keyToValue(sval.toLatin1());
- if (ival != -1) {
- qVariantSetValue(v, ival);
- converted = true;
- matchDistance += 10;
- }
- }
- }
- }
- } else {
- // determine how well the conversion matched
- if (actual.isNumber()) {
- switch (tid) {
- case QMetaType::Double:
- // perfect
- break;
- case QMetaType::Float:
- matchDistance += 1;
- break;
- case QMetaType::LongLong:
- case QMetaType::ULongLong:
- matchDistance += 2;
- break;
- case QMetaType::Long:
- case QMetaType::ULong:
- matchDistance += 3;
- break;
- case QMetaType::Int:
- case QMetaType::UInt:
- matchDistance += 4;
- break;
- case QMetaType::Short:
- case QMetaType::UShort:
- matchDistance += 5;
- break;
- case QMetaType::Char:
- case QMetaType::UChar:
- matchDistance += 6;
- break;
- default:
- matchDistance += 10;
- break;
- }
- } else if (actual.isString()) {
- switch (tid) {
- case QMetaType::QString:
- // perfect
- break;
- default:
- matchDistance += 10;
- break;
- }
- } else if (actual.isBoolean()) {
- switch (tid) {
- case QMetaType::Bool:
- // perfect
- break;
- default:
- matchDistance += 10;
- break;
- }
- } else if (actual.isDate()) {
- switch (tid) {
- case QMetaType::QDateTime:
- // perfect
- break;
- case QMetaType::QDate:
- matchDistance += 1;
- break;
- case QMetaType::QTime:
- matchDistance += 2;
- break;
- default:
- matchDistance += 10;
- break;
- }
- } else if (actual.isRegExp()) {
- switch (tid) {
- case QMetaType::QRegExp:
- // perfect
- break;
- default:
- matchDistance += 10;
- break;
- }
- } else if (actual.isVariant()) {
- if (argType.isVariant()
- || (actual.variantValue().userType() == tid)) {
- // perfect
- } else {
- matchDistance += 10;
- }
- } else if (actual.isArray()) {
- switch (tid) {
- case QMetaType::QStringList:
- case QMetaType::QVariantList:
- matchDistance += 5;
- break;
- default:
- matchDistance += 10;
- break;
- }
- } else if (actual.isQObject()) {
- switch (tid) {
- case QMetaType::QObjectStar:
- case QMetaType::QWidgetStar:
- // perfect
- break;
- default:
- matchDistance += 10;
- break;
- }
- } else if (actual.isNull()) {
- switch (tid) {
- case QMetaType::VoidStar:
- case QMetaType::QObjectStar:
- case QMetaType::QWidgetStar:
- // perfect
- break;
- default:
- if (!argType.name().endsWith('*'))
- matchDistance += 10;
- break;
- }
- } else {
- matchDistance += 10;
- }
- }
-
- if (converted)
- args[i+1] = v;
- }
-
- if (converted) {
- if ((context->argumentCount() == mtd.argumentCount())
- && (matchDistance == 0)) {
- // perfect match, use this one
- chosenMethod = mtd;
- chosenIndex = index;
- break;
- } else {
- bool redundant = false;
- if ((callType != QMetaMethod::Constructor)
- && (index < meta->methodOffset())) {
- // it is possible that a virtual method is redeclared in a subclass,
- // in which case we want to ignore the superclass declaration
- for (int i = 0; i < candidates.size(); ++i) {
- const QScriptMetaArguments &other = candidates.at(i);
- if (mtd.types() == other.method.types()) {
- redundant = true;
- break;
- }
- }
- }
- if (!redundant) {
- QScriptMetaArguments metaArgs(matchDistance, index, mtd, args);
- if (candidates.isEmpty()) {
- candidates.append(metaArgs);
- } else {
- const QScriptMetaArguments &otherArgs = candidates.at(0);
- if ((args.count() > otherArgs.args.count())
- || ((args.count() == otherArgs.args.count())
- && (matchDistance <= otherArgs.matchDistance))) {
- candidates.prepend(metaArgs);
- } else {
- candidates.append(metaArgs);
- }
- }
- }
- }
- } else if (mtd.fullyResolved()) {
- conversionFailed.append(index);
- }
-
- if (!maybeOverloaded)
- break;
- }
-
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- if ((index == -1) && (lastFoundIndex != limit) && maybeOverloaded
- && (callType != QMetaMethod::Constructor)) {
- metaCache->setMethodLowerBound(initialIndex, lastFoundIndex);
- }
-#endif
-
- if ((chosenIndex == -1) && candidates.isEmpty()) {
- context->calleeMetaIndex = initialIndex;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine->notifyFunctionEntry(context);
-#endif
- if (!conversionFailed.isEmpty()) {
- QString message = QString::fromLatin1("incompatible type of argument(s) in call to %0(); candidates were\n")
- .arg(QLatin1String(funName));
- for (int i = 0; i < conversionFailed.size(); ++i) {
- if (i > 0)
- message += QLatin1String("\n");
- QMetaMethod mtd = metaMethod(meta, callType, conversionFailed.at(i));
- message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature()));
- }
- result = context->throwError(QScriptContext::TypeError, message);
- } else if (!unresolved.isEmpty()) {
- QScriptMetaArguments argsInstance = unresolved.first();
- int unresolvedIndex = argsInstance.method.firstUnresolvedIndex();
- Q_ASSERT(unresolvedIndex != -1);
- QScriptMetaType unresolvedType = argsInstance.method.type(unresolvedIndex);
- QString unresolvedTypeName = QString::fromLatin1(unresolvedType.name());
- QString message = QString::fromLatin1("cannot call %0(): ")
- .arg(QString::fromLatin1(funName));
- if (unresolvedIndex > 0) {
- message.append(QString::fromLatin1("argument %0 has unknown type `%1'").
- arg(unresolvedIndex).arg(unresolvedTypeName));
- } else {
- message.append(QString::fromLatin1("unknown return type `%0'")
- .arg(unresolvedTypeName));
- }
- message.append(QString::fromLatin1(" (register the type with qScriptRegisterMetaType())"));
- result = context->throwError(QScriptContext::TypeError, message);
- } else {
- QString message = QString::fromLatin1("too few arguments in call to %0(); candidates are\n")
- .arg(QLatin1String(funName));
- for (int i = 0; i < tooFewArgs.size(); ++i) {
- if (i > 0)
- message += QLatin1String("\n");
- QMetaMethod mtd = metaMethod(meta, callType, tooFewArgs.at(i));
- message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature()));
- }
- result = context->throwError(QScriptContext::SyntaxError, message);
- }
- } else {
- if (chosenIndex == -1) {
- QScriptMetaArguments metaArgs = candidates.at(0);
- if ((candidates.size() > 1)
- && (metaArgs.args.count() == candidates.at(1).args.count())
- && (metaArgs.matchDistance == candidates.at(1).matchDistance)) {
- // ambiguous call
- QString message = QString::fromLatin1("ambiguous call of overloaded function %0(); candidates were\n")
- .arg(QLatin1String(funName));
- for (int i = 0; i < candidates.size(); ++i) {
- if (i > 0)
- message += QLatin1String("\n");
- QMetaMethod mtd = metaMethod(meta, callType, candidates.at(i).index);
- message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature()));
- }
- result = context->throwError(QScriptContext::TypeError, message);
- } else {
- chosenMethod = metaArgs.method;
- chosenIndex = metaArgs.index;
- args = metaArgs.args;
- }
- }
-
- if (chosenIndex != -1) {
- // call it
- context->calleeMetaIndex = chosenIndex;
-
- QVarLengthArray<void*, 9> array(args.count());
- void **params = array.data();
- for (int i = 0; i < args.count(); ++i) {
- const QVariant &v = args[i];
- switch (chosenMethod.type(i).kind()) {
- case QScriptMetaType::Variant:
- params[i] = const_cast<QVariant*>(&v);
- break;
- case QScriptMetaType::MetaType:
- case QScriptMetaType::MetaEnum:
- case QScriptMetaType::Unresolved:
- params[i] = const_cast<void*>(v.constData());
- break;
- default:
- Q_ASSERT(0);
- }
- }
-
- QScriptable *scriptable = 0;
- if (thisQObject)
- scriptable = scriptableFromQObject(thisQObject);
- QScriptEngine *oldEngine = 0;
- if (scriptable) {
- oldEngine = QScriptablePrivate::get(scriptable)->engine;
- QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine);
- }
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine->notifyFunctionEntry(context);
-#endif
-
- if (callType == QMetaMethod::Constructor) {
- Q_ASSERT(meta != 0);
- meta->static_metacall(QMetaObject::CreateInstance, chosenIndex, params);
- } else {
- Q_ASSERT(thisQObject != 0);
- thisQObject->qt_metacall(QMetaObject::InvokeMetaMethod, chosenIndex, params);
- }
-
- if (scriptable)
- QScriptablePrivate::get(scriptable)->engine = oldEngine;
-
- if (context->state() == QScriptContext::ExceptionState) {
- result = context->returnValue(); // propagate
- } else {
- QScriptMetaType retType = chosenMethod.returnType();
- if (retType.isVariant()) {
- result = engine->valueFromVariant(*(QVariant *)params[0]);
- } else if (retType.typeId() != 0) {
- result = engine->create(retType.typeId(), params[0]);
- if (!result.isValid())
- engine->newVariant(&result, QVariant(retType.typeId(), params[0]));
- } else {
- result = engine->undefinedValue();
- }
- }
- }
- }
-
- context->m_result = result;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- engine->notifyFunctionExit(context);
-#endif
-}
-
-
-class ExtQObjectDataIterator: public QScriptClassDataIterator
-{
-public:
- ExtQObjectDataIterator(const QScriptValueImpl &object);
- virtual ~ExtQObjectDataIterator();
-
- virtual bool hasNext() const;
- virtual void next(QScript::Member *member);
-
- virtual bool hasPrevious() const;
- virtual void previous(QScript::Member *member);
-
- virtual void toFront();
- virtual void toBack();
-
-private:
- enum State {
- MetaProperties,
- DynamicProperties,
- MetaMethods
- };
-
- QScriptValueImpl m_object;
- int m_index;
- State m_state;
-};
-
-ExtQObjectDataIterator::ExtQObjectDataIterator(const QScriptValueImpl &object)
-{
- m_object = object;
- toFront();
-}
-
-ExtQObjectDataIterator::~ExtQObjectDataIterator()
-{
-}
-
-bool ExtQObjectDataIterator::hasNext() const
-{
- ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object);
- if (!inst->value)
- return false;
- const QMetaObject *meta = inst->value->metaObject();
- int i = m_index;
-
- switch (m_state) {
- case MetaProperties: {
- for ( ; i < meta->propertyCount(); ++i) {
- QMetaProperty prop = meta->property(i);
- if (isEnumerableMetaProperty(prop, meta, i)
- && !isObjectProperty(m_object, prop.name())) {
- return true;
- }
- }
- i = 0;
- // fall-through
- }
-
- case DynamicProperties: {
- QList<QByteArray> dpNames = inst->value->dynamicPropertyNames();
- for ( ; i < dpNames.count(); ++i) {
- if (!isObjectProperty(m_object, dpNames.at(i))) {
- return true;
- }
- }
- if (inst->options & QScriptEngine::SkipMethodsInEnumeration)
- return false;
- i = (inst->options & QScriptEngine::ExcludeSuperClassMethods)
- ? meta->methodOffset() : 0;
- // fall-through
- }
-
- case MetaMethods: {
- for ( ; i < meta->methodCount(); ++i) {
- QMetaMethod method = meta->method(i);
- if (hasMethodAccess(method, i, inst->options)
- && !isObjectProperty(m_object, method.signature())) {
- return true;
- }
- }
- }
-
- } // switch
-
- return false;
-}
-
-void ExtQObjectDataIterator::next(QScript::Member *member)
-{
- QScriptEnginePrivate *eng = m_object.engine();
- ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object);
- if (!inst->value)
- return;
- const QMetaObject *meta = inst->value->metaObject();
- int i = m_index;
-
- switch (m_state) {
- case MetaProperties: {
- for ( ; i < meta->propertyCount(); ++i) {
- QMetaProperty prop = meta->property(i);
- if (isEnumerableMetaProperty(prop, meta, i)
- && !isObjectProperty(m_object, prop.name())) {
- QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(prop.name()));
- member->native(nameId, i, flagsForMetaProperty(prop));
- m_index = i + 1;
- return;
- }
- }
- m_state = DynamicProperties;
- m_index = 0;
- i = m_index;
- // fall-through
- }
-
- case DynamicProperties: {
- QList<QByteArray> dpNames = inst->value->dynamicPropertyNames();
- for ( ; i < dpNames.count(); ++i) {
- if (!isObjectProperty(m_object, dpNames.at(i))) {
- QByteArray name = dpNames.at(i);
- QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(name));
- member->native(nameId, i,
- QScriptValue::QObjectMember
- | DYNAPROPERTY_ID);
- m_index = i + 1;
- return;
- }
- }
- m_state = MetaMethods;
- m_index = (inst->options & QScriptEngine::ExcludeSuperClassMethods)
- ? meta->methodOffset() : 0;
- i = m_index;
- // fall-through
- }
-
- case MetaMethods: {
- for ( ; i < meta->methodCount(); ++i) {
- QMetaMethod method = meta->method(i);
- if (hasMethodAccess(method, i, inst->options)
- && !isObjectProperty(m_object, method.signature())) {
- QMetaMethod method = meta->method(i);
- QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(method.signature()));
- member->native(nameId, i,
- QScriptValue::QObjectMember
- | METHOD_ID);
- m_index = i + 1;
- return;
- }
- }
- }
-
- } // switch
-
- member->invalidate();
-}
-
-bool ExtQObjectDataIterator::hasPrevious() const
-{
- ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object);
- if (!inst->value)
- return false;
- const QMetaObject *meta = inst->value->metaObject();
- int i = m_index - 1;
-
- switch (m_state) {
- case MetaMethods: {
- int limit = (inst->options & QScriptEngine::ExcludeSuperClassMethods)
- ? meta->methodOffset() : 0;
- for ( ; i >= limit; --i) {
- QMetaMethod method = meta->method(i);
- if (hasMethodAccess(method, i, inst->options)
- && !isObjectProperty(m_object, method.signature())) {
- return true;
- }
- }
- i = inst->value->dynamicPropertyNames().count() - 1;
- // fall-through
- }
-
- case DynamicProperties: {
- QList<QByteArray> dpNames = inst->value->dynamicPropertyNames();
- for ( ; i >= 0; --i) {
- if (!isObjectProperty(m_object, dpNames.at(i))) {
- return true;
- }
- }
- i = meta->propertyCount() - 1;
- // fall-through
- }
-
- case MetaProperties: {
- int limit = (inst->options & QScriptEngine::ExcludeSuperClassProperties)
- ? meta->propertyOffset() : 0;
- for ( ; i >= limit; --i) {
- QMetaProperty prop = meta->property(i);
- if (isEnumerableMetaProperty(prop, meta, i)
- && !isObjectProperty(m_object, prop.name())) {
- return true;
- }
- }
- }
-
- } // switch
-
- return false;
-}
-
-void ExtQObjectDataIterator::previous(QScript::Member *member)
-{
- QScriptEnginePrivate *eng = m_object.engine();
- ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object);
- if (!inst->value)
- return;
- const QMetaObject *meta = inst->value->metaObject();
- int i = m_index - 1;
-
- switch (m_state) {
- case MetaMethods: {
- int limit = (inst->options & QScriptEngine::ExcludeSuperClassMethods)
- ? meta->methodOffset() : 0;
- for ( ; i >= limit; --i) {
- QMetaMethod method = meta->method(i);
- if (hasMethodAccess(method, i, inst->options)
- && !isObjectProperty(m_object, method.signature())) {
- QMetaMethod method = meta->method(i);
- QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(method.signature()));
- member->native(nameId, i,
- QScriptValue::QObjectMember
- | METHOD_ID);
- m_index = i;
- return;
- }
- }
- m_state = DynamicProperties;
- m_index = inst->value->dynamicPropertyNames().count() - 1;
- i = m_index;
- // fall-through
- }
-
- case DynamicProperties: {
- QList<QByteArray> dpNames = inst->value->dynamicPropertyNames();
- for ( ; i >= 0; --i) {
- if (!isObjectProperty(m_object, dpNames.at(i))) {
- QByteArray name = dpNames.at(i);
- QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(name));
- member->native(nameId, i,
- QScriptValue::QObjectMember
- | DYNAPROPERTY_ID);
- m_index = i;
- return;
- }
- }
- m_state = MetaProperties;
- m_index = meta->propertyCount() - 1;
- i = m_index;
- // fall-through
- }
-
- case MetaProperties: {
- int limit = (inst->options & QScriptEngine::ExcludeSuperClassProperties)
- ? meta->propertyOffset() : 0;
- for ( ; i >= limit; --i) {
- QMetaProperty prop = meta->property(i);
- if (isEnumerableMetaProperty(prop, meta, i)
- && !isObjectProperty(m_object, prop.name())) {
- QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(prop.name()));
- member->native(nameId, i, flagsForMetaProperty(prop));
- m_index = i;
- return;
- }
- }
- }
-
- } // switch
-
- member->invalidate();
-}
-
-void ExtQObjectDataIterator::toFront()
-{
- ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object);
- if (!inst->value)
- return;
- m_state = MetaProperties;
- const QMetaObject *meta = inst->value->metaObject();
- m_index = (inst->options & QScriptEngine::ExcludeSuperClassProperties)
- ? meta->propertyOffset() : 0;
-}
-
-void ExtQObjectDataIterator::toBack()
-{
- ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object);
- if (!inst->value)
- return;
- if (inst->options & QScriptEngine::SkipMethodsInEnumeration) {
- m_state = DynamicProperties;
- m_index = inst->value->dynamicPropertyNames().count();
- } else {
- m_state = MetaMethods;
- const QMetaObject *meta = inst->value->metaObject();
- m_index = meta->methodCount();
- }
-}
-
-class ExtQObjectData: public QScriptClassData
-{
-public:
- ExtQObjectData(QScriptClassInfo *classInfo)
- : m_classInfo(classInfo)
- {
- }
-
- virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *,
- QScript::AccessMode access)
- {
- ExtQObject::Instance *inst = ExtQObject::Instance::get(object, m_classInfo);
- QObject *qobject = inst->value;
- if (! qobject) {
- // the object was deleted. We return true so we can
- // throw an error in get()/put()
- member->native(nameId, /*id=*/-1, /*flags=*/0);
- return true;
- }
-
- const QScriptEngine::QObjectWrapOptions &opt = inst->options;
- const QMetaObject *meta = qobject->metaObject();
-
- QScriptEnginePrivate *eng = object.engine();
-
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- QScriptMetaObject *metaCache = eng->cachedMetaObject(meta);
- if (metaCache->findMember(nameId, member)) {
- bool ignore = false;
- switch (member->flags() & ID_MASK) {
- case PROPERTY_ID:
- ignore = (opt & QScriptEngine::ExcludeSuperClassProperties)
- && (member->id() < meta->propertyOffset());
- break;
- case METHOD_ID:
- ignore = ((opt & QScriptEngine::ExcludeSuperClassMethods)
- && (member->id() < meta->methodOffset()))
- || ((opt & QScriptEngine::ExcludeDeleteLater)
- && (member->id() == 2));
- break;
- // we don't cache dynamic properties nor children,
- // so no need to handle DYNAPROPERTY_ID and CHILD_ID
- default:
- break;
- }
- if (!ignore)
- return true;
- }
-#endif
-
- QString memberName = eng->toString(nameId);
- QByteArray name = memberName.toLatin1();
-
- int index = -1;
-
- if (name.contains('(')) {
- QByteArray normalized = QMetaObject::normalizedSignature(name);
- if (-1 != (index = meta->indexOfMethod(normalized))) {
- QMetaMethod method = meta->method(index);
- if (hasMethodAccess(method, index, opt)) {
- member->native(nameId, index,
- QScriptValue::QObjectMember
- | METHOD_ID);
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- metaCache->registerMember(nameId, *member);
-#endif
- if (!(opt & QScriptEngine::ExcludeSuperClassMethods)
- || (index >= meta->methodOffset())) {
- return true;
- }
- }
- }
- }
-
- index = meta->indexOfProperty(name);
- if (index != -1) {
- QMetaProperty prop = meta->property(index);
- if (prop.isScriptable()) {
- member->native(nameId, index, flagsForMetaProperty(prop));
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- metaCache->registerMember(nameId, *member);
-#endif
- if (!(opt & QScriptEngine::ExcludeSuperClassProperties)
- || (index >= meta->propertyOffset())) {
- return true;
- }
- }
- }
-
- index = qobject->dynamicPropertyNames().indexOf(name);
- if (index != -1) {
- member->native(nameId, index,
- QScriptValue::QObjectMember
- | DYNAPROPERTY_ID);
- // not cached because it can be removed
- return true;
- }
-
- const int offset = (opt & QScriptEngine::ExcludeSuperClassMethods)
- ? meta->methodOffset() : 0;
- for (index = meta->methodCount() - 1; index >= offset; --index) {
- QMetaMethod method = meta->method(index);
- if (hasMethodAccess(method, index, opt)
- && (methodName(method) == name)) {
- member->native(nameId, index,
- QScriptValue::QObjectMember
- | METHOD_ID
- | MAYBE_OVERLOADED);
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- metaCache->registerMember(nameId, *member);
-#endif
- return true;
- }
- }
-
- if (!(opt & QScriptEngine::ExcludeChildObjects)) {
- QList<QObject*> children = qobject->children();
- for (index = 0; index < children.count(); ++index) {
- QObject *child = children.at(index);
- if (child->objectName() == memberName) {
- member->native(nameId, index,
- QScriptValue::ReadOnly
- | QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration
- | CHILD_ID);
- // not cached because it can be removed or change name
- return true;
- }
- }
- }
-
- if ((access & QScript::Write) && (opt & QScriptEngine::AutoCreateDynamicProperties)) {
- member->native(nameId, -1, DYNAPROPERTY_ID);
- return true;
- }
-
- return false;
- }
-
- virtual bool get(const QScriptValueImpl &obj, const QScript::Member &member, QScriptValueImpl *result)
- {
- if (! member.isNativeProperty())
- return false;
-
- QScriptEnginePrivate *eng = obj.engine();
-
- ExtQObject::Instance *inst = ExtQObject::Instance::get(obj, m_classInfo);
- QObject *qobject = inst->value;
- if (!qobject) {
- QScriptContextPrivate *ctx = eng->currentContext();
- *result = ctx->throwError(
- QString::fromLatin1("cannot access member `%0' of deleted QObject")
- .arg(member.nameId()->s));
- return true;
- }
-
- switch (member.flags() & ID_MASK) {
- case PROPERTY_ID: {
- const QMetaObject *meta = qobject->metaObject();
- const int propertyIndex = member.id();
- QMetaProperty prop = meta->property(propertyIndex);
- Q_ASSERT(prop.isScriptable());
- if (GeneratePropertyFunctions) {
- QScriptValueImpl accessor;
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- QScriptMetaObject *metaCache = eng->cachedMetaObject(meta);
- accessor = metaCache->findPropertyAccessor(propertyIndex);
- if (!accessor.isValid()) {
-#endif
- accessor = eng->createFunction(new QtPropertyFunction(meta, propertyIndex));
-#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE
- metaCache->registerPropertyAccessor(propertyIndex, accessor);
- }
-#endif
- *result = accessor;
- } else {
- QVariant v = prop.read(qobject);
- *result = eng->valueFromVariant(v);
- }
- } break;
-
- case DYNAPROPERTY_ID: {
- if (member.id() != -1) {
- QVariant v = qobject->property(member.nameId()->s.toLatin1());
- *result = eng->valueFromVariant(v);
- } else {
- *result = eng->undefinedValue();
- }
- } break;
-
- case METHOD_ID: {
- QScript::Member m;
- bool maybeOverloaded = (member.flags() & MAYBE_OVERLOADED) != 0;
- *result = eng->createFunction(new QtFunction(obj, member.id(),
- maybeOverloaded));
- // make it persist (otherwise Function.prototype.disconnect() would fail)
- uint flags = QScriptValue::QObjectMember;
- if (inst->options & QScriptEngine::SkipMethodsInEnumeration)
- flags |= QScriptValue::SkipInEnumeration;
- QScriptObject *instance = obj.objectValue();
- if (!instance->findMember(member.nameId(), &m))
- instance->createMember(member.nameId(), &m, flags);
- instance->put(m, *result);
- } break;
-
- case CHILD_ID: {
- QObject *child = qobject->children().at(member.id());
- result->invalidate();
- QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject;
- eng->newQObject(result, child, QScriptEngine::QtOwnership, opt);
- } break;
-
- } // switch
-
- return true;
- }
-
- virtual bool put(QScriptValueImpl *object, const QScript::Member &member, const QScriptValueImpl &value)
- {
- if (! member.isNativeProperty() || ! member.isWritable())
- return false;
-
- ExtQObject::Instance *inst = ExtQObject::Instance::get(*object, m_classInfo);
- QObject *qobject = inst->value;
- if (!qobject) {
- QScriptEnginePrivate *eng = object->engine();
- QScriptContextPrivate *ctx = eng->currentContext();
- ctx->throwError(QString::fromLatin1("cannot access member `%0' of deleted QObject")
- .arg(member.nameId()->s));
- return true;
- }
-
- switch (member.flags() & ID_MASK) {
- case CHILD_ID:
- return false;
-
- case METHOD_ID: {
- QScript::Member m;
- QScriptObject *instance = object->objectValue();
- if (!instance->findMember(member.nameId(), &m)) {
- instance->createMember(member.nameId(), &m,
- /*flags=*/0);
- }
- instance->put(m, value);
- return true;
- }
-
- case PROPERTY_ID:
- if (GeneratePropertyFunctions) {
- // we shouldn't get here, QScriptValueImpl::setProperty() messed up
- Q_ASSERT_X(0, "put", "Q_PROPERTY access cannot be overridden");
- return false;
- } else {
- const QMetaObject *meta = qobject->metaObject();
- QMetaProperty prop = meta->property(member.id());
- Q_ASSERT(prop.isScriptable());
- QVariant v = variantFromValue(object->engine(), prop.userType(), value);
- bool ok = prop.write(qobject, v);
- return ok;
- }
-
- case DYNAPROPERTY_ID: {
- QVariant v = value.toVariant();
- return ! qobject->setProperty(member.nameId()->s.toLatin1(), v);
- }
-
- } // switch
- return false;
- }
-
- virtual bool removeMember(const QScriptValueImpl &object,
- const QScript::Member &member)
- {
- QObject *qobject = object.toQObject();
- if (!qobject || !member.isNativeProperty() || !member.isDeletable())
- return false;
-
- if ((member.flags() & ID_MASK) == DYNAPROPERTY_ID) {
- qobject->setProperty(member.nameId()->s.toLatin1(), QVariant());
- return true;
- }
-
- return false;
- }
-
- virtual void mark(const QScriptValueImpl &, int)
- {
- }
-
- virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object)
- {
- return new ExtQObjectDataIterator(object);
- }
-
-private:
- QScriptClassInfo *m_classInfo;
-};
-
-struct QObjectConnection
-{
- int slotIndex;
- QScriptValueImpl receiver;
- QScriptValueImpl slot;
- QScriptValueImpl senderWrapper;
-
- QObjectConnection(int i, const QScriptValueImpl &r, const QScriptValueImpl &s,
- const QScriptValueImpl &sw)
- : slotIndex(i), receiver(r), slot(s), senderWrapper(sw) {}
- QObjectConnection() : slotIndex(-1) {}
-
- bool hasTarget(const QScriptValueImpl &r, const QScriptValueImpl &s) const
- {
- if (r.isObject() != receiver.isObject())
- return false;
- if ((r.isObject() && receiver.isObject())
- && (r.objectValue() != receiver.objectValue())) {
- return false;
- }
- return (s.objectValue() == slot.objectValue());
- }
-
- void mark(int generation)
- {
- if (senderWrapper.isValid() && !senderWrapper.isMarked(generation)) {
- // see if the sender should be marked or not
- ExtQObject::Instance *inst = ExtQObject::Instance::get(senderWrapper);
- if ((inst->ownership == QScriptEngine::ScriptOwnership)
- || ((inst->ownership == QScriptEngine::AutoOwnership)
- && inst->value && !inst->value->parent())) {
- senderWrapper.invalidate();
- } else {
- senderWrapper.mark(generation);
- }
- }
- if (receiver.isValid())
- receiver.mark(generation);
- if (slot.isValid())
- slot.mark(generation);
- }
-};
-
-class QObjectConnectionManager: public QObject
-{
-public:
- QObjectConnectionManager();
- ~QObjectConnectionManager();
-
- bool addSignalHandler(QObject *sender, int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &slot,
- const QScriptValueImpl &senderWrapper = QScriptValueImpl());
- bool removeSignalHandler(
- QObject *sender, int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &slot);
-
- static const QMetaObject staticMetaObject;
- virtual const QMetaObject *metaObject() const;
- virtual void *qt_metacast(const char *);
- virtual int qt_metacall(QMetaObject::Call, int, void **argv);
-
- void execute(int slotIndex, void **argv);
-
- void mark(int generation);
-
-private:
- int m_slotCounter;
- QVector<QVector<QObjectConnection> > connections;
-};
-
-} // ::QScript
-
-
-
-QScript::ExtQObject::ExtQObject(QScriptEnginePrivate *eng):
- Ecma::Core(eng, QLatin1String("QObject"), QScriptClassInfo::QObjectType)
-{
- newQObject(&publicPrototype, new QScript::QObjectPrototype(),
- QScriptEngine::AutoOwnership,
- QScriptEngine::ExcludeSuperClassMethods
- | QScriptEngine::ExcludeSuperClassProperties
- | QScriptEngine::ExcludeChildObjects);
-
- eng->newConstructor(&ctor, this, publicPrototype);
- addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
- addPrototypeFunction(QLatin1String("findChild"), method_findChild, 1);
- addPrototypeFunction(QLatin1String("findChildren"), method_findChildren, 1);
-
- classInfo()->setData(new QScript::ExtQObjectData(classInfo()));
-}
-
-QScript::ExtQObject::~ExtQObject()
-{
-}
-
-void QScript::ExtQObject::execute(QScriptContextPrivate *context)
-{
- QScriptValueImpl tmp;
- newQObject(&tmp, 0);
- context->setReturnValue(tmp);
-}
-
-void QScript::ExtQObject::newQObject(QScriptValueImpl *result, QObject *value,
- QScriptEngine::ValueOwnership ownership,
- const QScriptEngine::QObjectWrapOptions &options)
-{
- Instance *instance;
- if (!result->isValid()) {
- engine()->newObject(result, publicPrototype, classInfo());
- instance = new Instance();
- result->setObjectData(instance);
- } else {
- Q_ASSERT(result->isObject());
- if (result->classInfo() != classInfo()) {
- result->destroyObjectData();
- result->setClassInfo(classInfo());
- instance = new Instance();
- result->setObjectData(instance);
- } else {
- instance = Instance::get(*result);
- }
- }
- instance->value = value;
- instance->ownership = ownership;
- instance->options = options;
-}
-
-QScriptValueImpl QScript::ExtQObject::method_findChild(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- if (Instance *instance = Instance::get(context->thisObject(), classInfo)) {
- QObject *obj = instance->value;
- QString name = context->argument(0).toString();
- QObject *child = qFindChild<QObject*>(obj, name);
- QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject;
- QScriptValueImpl result;
- eng->newQObject(&result, child, QScriptEngine::QtOwnership, opt);
- return result;
- }
- return eng->undefinedValue();
-}
-
-QScriptValueImpl QScript::ExtQObject::method_findChildren(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- if (Instance *instance = Instance::get(context->thisObject(), classInfo)) {
- QObject *obj = instance->value;
- QList<QObject*> found;
- QScriptValueImpl arg = context->argument(0);
-#ifndef QT_NO_REGEXP
- if (arg.isRegExp()) {
- QRegExp re = arg.toRegExp();
- found = qFindChildren<QObject*>(obj, re);
- } else
-#endif
- {
- QString name = arg.isUndefined() ? QString() : arg.toString();
- found = qFindChildren<QObject*>(obj, name);
- }
- QScriptValueImpl result = eng->newArray(found.size());
- QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject;
- for (int i = 0; i < found.size(); ++i) {
- QScriptValueImpl value;
- eng->newQObject(&value, found.at(i), QScriptEngine::QtOwnership, opt);
- result.setProperty(i, value);
- }
- return result;
- }
- return eng->undefinedValue();
-}
-
-QScriptValueImpl QScript::ExtQObject::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- if (Instance *instance = Instance::get(context->thisObject(), classInfo)) {
- QObject *obj = instance->value;
- const QMetaObject *meta = obj ? obj->metaObject() : &QObject::staticMetaObject;
- QString name = obj ? obj->objectName() : QString::fromUtf8("unnamed");
-
- QString str = QString::fromUtf8("%0(name = \"%1\")")
- .arg(QLatin1String(meta->className())).arg(name);
- return QScriptValueImpl(eng, str);
- }
- return eng->undefinedValue();
-}
-
-
-
-static const uint qt_meta_data_QObjectConnectionManager[] = {
-
- // content:
- 1, // revision
- 0, // classname
- 0, 0, // classinfo
- 1, 10, // methods
- 0, 0, // properties
- 0, 0, // enums/sets
-
- // slots: signature, parameters, type, tag, flags
- 35, 34, 34, 34, 0x0a,
-
- 0 // eod
-};
-
-static const char qt_meta_stringdata_QObjectConnectionManager[] = {
- "QScript::QObjectConnectionManager\0\0execute()\0"
-};
-
-const QMetaObject QScript::QObjectConnectionManager::staticMetaObject = {
- { &QObject::staticMetaObject, qt_meta_stringdata_QObjectConnectionManager,
- qt_meta_data_QObjectConnectionManager, 0 }
-};
-
-const QMetaObject *QScript::QObjectConnectionManager::metaObject() const
-{
- return &staticMetaObject;
-}
-
-void *QScript::QObjectConnectionManager::qt_metacast(const char *_clname)
-{
- if (!_clname) return 0;
- if (!strcmp(_clname, qt_meta_stringdata_QObjectConnectionManager))
- return static_cast<void*>(const_cast<QObjectConnectionManager*>(this));
- return QObject::qt_metacast(_clname);
-}
-
-int QScript::QObjectConnectionManager::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
-{
- _id = QObject::qt_metacall(_c, _id, _a);
- if (_id < 0)
- return _id;
- if (_c == QMetaObject::InvokeMetaMethod) {
- execute(_id, _a);
- _id -= m_slotCounter;
- }
- return _id;
-}
-
-void QScript::QObjectConnectionManager::execute(int slotIndex, void **argv)
-{
- QScriptValueImpl receiver;
- QScriptValueImpl slot;
- QScriptValueImpl senderWrapper;
- int signalIndex = -1;
- for (int i = 0; i < connections.size(); ++i) {
- const QVector<QObjectConnection> &cs = connections.at(i);
- for (int j = 0; j < cs.size(); ++j) {
- const QObjectConnection &c = cs.at(j);
- if (c.slotIndex == slotIndex) {
- receiver = c.receiver;
- slot = c.slot;
- senderWrapper = c.senderWrapper;
- signalIndex = i;
- break;
- }
- }
- }
- Q_ASSERT(slot.isValid());
-
- QScriptEnginePrivate *eng = slot.engine();
-
- if (eng->isCollecting()) {
- // we can't do a script function call during GC,
- // so we're forced to ignore this signal
- return;
- }
-
- QScriptFunction *fun = eng->convertToNativeFunction(slot);
- if (fun == 0) {
- // the signal handler has been GC'ed. This can only happen when
- // a QObject is owned by the engine, the engine is destroyed, and
- // there is a script function connected to the destroyed() signal
- Q_ASSERT(signalIndex <= 1); // destroyed(QObject*)
- return;
- }
-
- const QMetaObject *meta = sender()->metaObject();
- const QMetaMethod method = meta->method(signalIndex);
-
- QList<QByteArray> parameterTypes = method.parameterTypes();
- int argc = parameterTypes.count();
-
- QScriptValueImpl activation;
- eng->newActivation(&activation);
- QScriptObject *activation_data = activation.objectValue();
- activation_data->m_scope = slot.scope();
-
- int formalCount = fun->formals.count();
- int mx = qMax(formalCount, argc);
- activation_data->m_members.resize(mx + 1);
- activation_data->m_values.resize(mx + 1);
- for (int i = 0; i < mx; ++i) {
- QScriptNameIdImpl *nameId;
- if (i < formalCount)
- nameId = fun->formals.at(i);
- else
- nameId = 0;
- activation_data->m_members[i].object(nameId, i,
- QScriptValue::Undeletable
- | QScriptValue::SkipInEnumeration);
- QScriptValueImpl actual;
- if (i < argc) {
- void *arg = argv[i + 1];
- QByteArray typeName = parameterTypes.at(i);
- int argType = QMetaType::type(typeName);
- if (!argType) {
- if (typeName == "QVariant") {
- actual = eng->valueFromVariant(*reinterpret_cast<QVariant*>(arg));
- } else {
- qWarning("QScriptEngine: Unable to handle unregistered datatype '%s' "
- "when invoking handler of signal %s::%s",
- typeName.constData(), meta->className(), method.signature());
- actual = eng->undefinedValue();
- }
- } else {
- actual = eng->create(argType, arg);
- }
- } else {
- actual = eng->undefinedValue();
- }
- activation_data->m_values[i] = actual;
- }
-
- QScriptValueImpl senderObject;
- if (senderWrapper.isQObject()) {
- senderObject = senderWrapper;
- } else {
- QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject;
- eng->newQObject(&senderObject, sender(), QScriptEngine::QtOwnership, opt);
- }
- activation_data->m_members[mx].object(eng->idTable()->id___qt_sender__, mx,
- QScriptValue::SkipInEnumeration);
- activation_data->m_values[mx] = senderObject;
-
- QScriptValueImpl thisObject;
- if (receiver.isObject())
- thisObject = receiver;
- else
- thisObject = eng->globalObject();
-
- QScriptContextPrivate *context_data = eng->pushContext();
- context_data->m_activation = activation;
- context_data->m_callee = slot;
- context_data->m_thisObject = thisObject;
- context_data->argc = argc;
- context_data->args = const_cast<QScriptValueImpl*> (activation_data->m_values.constData());
-
- fun->execute(context_data);
-
- eng->popContext();
- if (eng->hasUncaughtException())
- eng->emitSignalHandlerException();
-}
-
-QScript::QObjectConnectionManager::QObjectConnectionManager()
- : m_slotCounter(0)
-{
-}
-
-QScript::QObjectConnectionManager::~QObjectConnectionManager()
-{
-}
-
-void QScript::QObjectConnectionManager::mark(int generation)
-{
- for (int i = 0; i < connections.size(); ++i) {
- QVector<QObjectConnection> &cs = connections[i];
- for (int j = 0; j < cs.size(); ++j)
- cs[j].mark(generation);
- }
-}
-
-bool QScript::QObjectConnectionManager::addSignalHandler(
- QObject *sender, int signalIndex, const QScriptValueImpl &receiver,
- const QScriptValueImpl &function, const QScriptValueImpl &senderWrapper)
-{
- if (connections.size() <= signalIndex)
- connections.resize(signalIndex+1);
- QVector<QObjectConnection> &cs = connections[signalIndex];
- int absSlotIndex = m_slotCounter + metaObject()->methodOffset();
- bool ok = QMetaObject::connect(sender, signalIndex, this, absSlotIndex);
- if (ok) {
- cs.append(QScript::QObjectConnection(m_slotCounter++, receiver, function, senderWrapper));
- QMetaMethod signal = sender->metaObject()->method(signalIndex);
- QByteArray signalString;
- signalString.append('2'); // signal code
- signalString.append(signal.signature());
- static_cast<QScript::QObjectNotifyCaller*>(sender)->callConnectNotify(signalString);
- }
- return ok;
-}
-
-bool QScript::QObjectConnectionManager::removeSignalHandler(
- QObject *sender, int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &slot)
-{
- if (connections.size() <= signalIndex)
- return false;
- QVector<QObjectConnection> &cs = connections[signalIndex];
- for (int i = 0; i < cs.size(); ++i) {
- const QObjectConnection &c = cs.at(i);
- if (c.hasTarget(receiver, slot)) {
- int absSlotIndex = c.slotIndex + metaObject()->methodOffset();
- bool ok = QMetaObject::disconnect(sender, signalIndex, this, absSlotIndex);
- if (ok) {
- cs.remove(i);
- QMetaMethod signal = sender->metaObject()->method(signalIndex);
- QByteArray signalString;
- signalString.append('2'); // signal code
- signalString.append(signal.signature());
- static_cast<QScript::QObjectNotifyCaller*>(sender)->callDisconnectNotify(signalString);
- }
- return ok;
- }
- }
- return false;
-}
-
-
-
-QString QScript::QtPropertyFunction::functionName() const
-{
- QMetaProperty prop = m_meta->property(m_index);
- return QLatin1String(prop.name());
-}
-
-void QScript::QtPropertyFunction::execute(QScriptContextPrivate *context)
-{
- context->calleeMetaIndex = m_index;
-
- QScriptEnginePrivate *eng_p = context->engine();
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionEntry(context);
-#endif
- QScriptValueImpl result = eng_p->undefinedValue();
-
- QScriptValueImpl object = context->thisObject();
- QObject *qobject = object.toQObject();
- while ((!qobject || (qobject->metaObject() != m_meta))
- && object.prototype().isObject()) {
- object = object.prototype();
- qobject = object.toQObject();
- }
- Q_ASSERT(qobject);
-
- QMetaProperty prop = m_meta->property(m_index);
- Q_ASSERT(prop.isScriptable());
- if (context->argumentCount() == 0) {
- // get
- if (prop.isValid()) {
- QScriptable *scriptable = scriptableFromQObject(qobject);
- QScriptEngine *oldEngine = 0;
- if (scriptable) {
- oldEngine = QScriptablePrivate::get(scriptable)->engine;
- QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(eng_p);
- }
-
- QVariant v = prop.read(qobject);
-
- if (scriptable)
- QScriptablePrivate::get(scriptable)->engine = oldEngine;
-
- result = eng_p->valueFromVariant(v);
- }
- } else {
- // set
- QScriptValueImpl arg = context->argument(0);
- QVariant v;
- if (prop.isEnumType() && arg.isString()
- && !eng_p->demarshalFunction(prop.userType())) {
- // give QMetaProperty::write() a chance to convert from
- // string to enum value
- v = arg.toString();
- } else {
- v = variantFromValue(eng_p, prop.userType(), arg);
- }
-
- QScriptable *scriptable = scriptableFromQObject(qobject);
- QScriptEngine *oldEngine = 0;
- if (scriptable) {
- oldEngine = QScriptablePrivate::get(scriptable)->engine;
- QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(eng_p);
- }
-
- prop.write(qobject, v);
-
- if (scriptable)
- QScriptablePrivate::get(scriptable)->engine = oldEngine;
-
- result = context->argument(0);
- }
- if (!eng_p->hasUncaughtException())
- context->m_result = result;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionExit(context);
-#endif
-}
-
-QString QScript::QtFunction::functionName() const
-{
- const QMetaObject *meta = metaObject();
- if (!meta)
- return QString();
- QMetaMethod method = meta->method(m_initialIndex);
- return QLatin1String(methodName(method));
-}
-
-void QScript::QtFunction::mark(QScriptEnginePrivate *engine, int generation)
-{
- if (m_object.isValid())
- engine->markObject(m_object, generation);
- QScriptFunction::mark(engine, generation);
-}
-
-void QScript::QtFunction::execute(QScriptContextPrivate *context)
-{
- QScriptEnginePrivate *eng_p = context->engine();
- QObject *qobj = qobject();
- if (!qobj) {
- context->calleeMetaIndex = m_initialIndex;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionEntry(context);
-#endif
- context->throwError(QLatin1String("cannot call function of deleted QObject"));
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionExit(context);
-#endif
- return;
- }
-
- const QMetaObject *meta = qobj->metaObject();
-
- QObject *thisQObject = context->thisObject().toQObject();
- if (!thisQObject) // ### TypeError
- thisQObject = qobj;
-
- if (!meta->cast(thisQObject)) {
-#if 0
- // ### find common superclass, see if initialIndex is
- // in that class (or a superclass of that class),
- // then it's still safe to execute it
- funName = methodName(meta->method(m_initialIndex));
- context->throwError(
- QString::fromUtf8("cannot execute %0: %1 does not inherit %2")
- .arg(QLatin1String(funName))
- .arg(QLatin1String(thisQObject->metaObject()->className()))
- .arg(QLatin1String(meta->className())));
- return;
-#endif
- // invoking a function in the prototype
- thisQObject = qobj;
- }
-
- callQtMethod(context, QMetaMethod::Method, thisQObject,
- meta, m_initialIndex, m_maybeOverloaded);
-}
-
-int QScript::QtFunction::mostGeneralMethod(QMetaMethod *out) const
-{
- const QMetaObject *meta = metaObject();
- if (!meta)
- return -1;
- int index = m_initialIndex;
- QMetaMethod method = meta->method(index);
- if (maybeOverloaded() && (method.attributes() & QMetaMethod::Cloned)) {
- // find the most general method
- do {
- method = meta->method(--index);
- } while (method.attributes() & QMetaMethod::Cloned);
- }
- if (out)
- *out = method;
- return index;
-}
-
-QList<int> QScript::QtFunction::overloadedIndexes() const
-{
- if (!maybeOverloaded())
- return QList<int>();
- QList<int> result;
- QString name = functionName();
- const QMetaObject *meta = metaObject();
- for (int index = mostGeneralMethod() - 1; index >= 0; --index) {
- QString otherName = QString::fromLatin1(methodName(meta->method(index)));
- if (otherName == name)
- result.append(index);
- }
- return result;
-}
-
-/////////////////////////////////////////////////////////
-
-namespace QScript
-{
-
-ExtQMetaObject::Instance *ExtQMetaObject::Instance::get(const QScriptValueImpl &object,
- QScriptClassInfo *klass)
-{
- if (! klass || klass == object.classInfo())
- return static_cast<Instance*> (object.objectData());
-
- return 0;
-}
-
-void ExtQMetaObject::Instance::execute(QScriptContextPrivate *context)
-{
- if (ctor.isFunction()) {
- QScriptValueImplList args;
- for (int i = 0; i < context->argumentCount(); ++i)
- args << context->argument(i);
- QScriptEnginePrivate *eng = context->engine();
- context->m_result = eng->call(ctor, context->thisObject(), args,
- context->isCalledAsConstructor());
- } else {
- if (value->constructorCount() > 0) {
- callQtMethod(context, QMetaMethod::Constructor, /*thisQObject=*/0,
- value, value->constructorCount()-1, /*maybeOverloaded=*/true);
- if (context->state() == QScriptContext::NormalState) {
- ExtQObject::Instance *inst = ExtQObject::Instance::get(context->m_result);
- Q_ASSERT(inst != 0);
- inst->ownership = QScriptEngine::AutoOwnership;
- context->m_result.setPrototype(prototype);
- }
- } else {
- context->m_result = context->throwError(
- QScriptContext::TypeError,
- QString::fromUtf8("no constructor for %0")
- .arg(QLatin1String(value->className())));
- }
- }
-}
-
-struct StaticQtMetaObject : public QObject
-{
- static const QMetaObject *get()
- { return &static_cast<StaticQtMetaObject*> (0)->staticQtMetaObject; }
-};
-
-class ExtQMetaObjectData: public QScriptClassData
-{
-public:
- ExtQMetaObjectData(QScriptEnginePrivate *, QScriptClassInfo *classInfo);
-
- virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId,
- QScript::Member *member, QScriptValueImpl *base,
- QScript::AccessMode access);
- virtual bool get(const QScriptValueImpl &object, const QScript::Member &member,
- QScriptValueImpl *result);
- virtual bool put(QScriptValueImpl *object, const QScript::Member &member,
- const QScriptValueImpl &value);
- virtual void mark(const QScriptValueImpl &object, int generation);
-
-private:
- QScriptClassInfo *m_classInfo;
-};
-
-ExtQMetaObjectData::ExtQMetaObjectData(QScriptEnginePrivate *,
- QScriptClassInfo *classInfo)
- : m_classInfo(classInfo)
-{
-}
-
-bool ExtQMetaObjectData::resolve(const QScriptValueImpl &object,
- QScriptNameIdImpl *nameId,
- QScript::Member *member,
- QScriptValueImpl *base,
- QScript::AccessMode /*access*/)
-{
- const QMetaObject *meta = object.toQMetaObject();
- if (!meta)
- return false;
-
- QScriptEnginePrivate *eng_p = object.engine();
- if (eng_p->idTable()->id_prototype == nameId) {
- // prototype property is a proxy to constructor's prototype property
- member->native(nameId, /*id=*/0, QScriptValue::Undeletable);
- return true;
- }
-
- QByteArray name = eng_p->toString(nameId).toLatin1();
-
- for (int i = 0; i < meta->enumeratorCount(); ++i) {
- QMetaEnum e = meta->enumerator(i);
-
- for (int j = 0; j < e.keyCount(); ++j) {
- const char *key = e.key(j);
-
- if (! qstrcmp (key, name.constData())) {
- member->native(nameId, e.value(j), QScriptValue::ReadOnly);
- *base = object;
- return true;
- }
- }
- }
-
- return false;
-}
-
-bool ExtQMetaObjectData::get(const QScriptValueImpl &object,
- const QScript::Member &member,
- QScriptValueImpl *result)
-{
- if (! member.isNativeProperty())
- return false;
-
- QScriptEnginePrivate *eng_p = object.engine();
- if (eng_p->idTable()->id_prototype == member.nameId()) {
- ExtQMetaObject::Instance *inst = ExtQMetaObject::Instance::get(object, m_classInfo);
- if (inst->ctor.isFunction())
- *result = inst->ctor.property(eng_p->idTable()->id_prototype);
- else
- *result = inst->prototype;
- } else {
- *result = QScriptValueImpl(member.id());
- }
- return true;
-}
-
-bool ExtQMetaObjectData::put(QScriptValueImpl *object, const Member &member,
- const QScriptValueImpl &value)
-{
- if (! member.isNativeProperty())
- return false;
-
- QScriptEnginePrivate *eng_p = object->engine();
- if (eng_p->idTable()->id_prototype == member.nameId()) {
- ExtQMetaObject::Instance *inst = ExtQMetaObject::Instance::get(*object, m_classInfo);
- if (inst->ctor.isFunction())
- inst->ctor.setProperty(eng_p->idTable()->id_prototype, value);
- else
- inst->prototype = value;
- }
-
- return true;
-}
-
-void ExtQMetaObjectData::mark(const QScriptValueImpl &object, int generation)
-{
- ExtQMetaObject::Instance *inst = ExtQMetaObject::Instance::get(object, m_classInfo);
- if (inst->ctor.isObject() || inst->ctor.isString())
- inst->ctor.mark(generation);
-}
-
-} // namespace QScript
-
-QScript::ExtQMetaObject::ExtQMetaObject(QScriptEnginePrivate *eng)
- : Ecma::Core(eng, QLatin1String("QMetaObject"), QScriptClassInfo::QMetaObjectType)
-{
- newQMetaObject(&publicPrototype, QScript::StaticQtMetaObject::get());
-
- eng->newConstructor(&ctor, this, publicPrototype);
- addPrototypeFunction(QLatin1String("className"), method_className, 0);
-
- classInfo()->setData(new QScript::ExtQMetaObjectData(eng, classInfo()));
-}
-
-QScript::ExtQMetaObject::~ExtQMetaObject()
-{
-}
-
-void QScript::ExtQMetaObject::execute(QScriptContextPrivate *context)
-{
- QScriptValueImpl tmp;
- newQMetaObject(&tmp, 0);
- context->setReturnValue(tmp);
-}
-
-void QScript::ExtQMetaObject::newQMetaObject(QScriptValueImpl *result, const QMetaObject *value,
- const QScriptValueImpl &ctor)
-{
- Instance *instance = new Instance();
- instance->value = value;
- if (ctor.isFunction()) {
- instance->ctor = ctor;
- } else {
- instance->prototype = engine()->newObject();
- instance->prototype.setPrototype(engine()->qobjectConstructor->publicPrototype);
- }
-
- engine()->newObject(result, publicPrototype, classInfo());
- result->setObjectData(instance);
-}
-
-QScriptValueImpl QScript::ExtQMetaObject::method_className(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- if (Instance *instance = Instance::get(context->thisObject(), classInfo)) {
- return QScriptValueImpl(eng, QString::fromLatin1(instance->value->className()));
- }
- return eng->undefinedValue();
-}
-
-QScriptQObjectData::QScriptQObjectData()
- : m_connectionManager(0)
-{
-}
-
-QScriptQObjectData::~QScriptQObjectData()
-{
- if (m_connectionManager) {
- delete m_connectionManager;
- m_connectionManager = 0;
- }
-}
-
-bool QScriptQObjectData::addSignalHandler(QObject *sender,
- int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &slot,
- const QScriptValueImpl &senderWrapper)
-{
- if (!m_connectionManager)
- m_connectionManager = new QScript::QObjectConnectionManager();
- return m_connectionManager->addSignalHandler(
- sender, signalIndex, receiver, slot, senderWrapper);
-}
-
-bool QScriptQObjectData::removeSignalHandler(QObject *sender,
- int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &slot)
-{
- if (!m_connectionManager)
- return false;
- return m_connectionManager->removeSignalHandler(
- sender, signalIndex, receiver, slot);
-}
-
-bool QScriptQObjectData::findWrapper(QScriptEngine::ValueOwnership ownership,
- const QScriptEngine::QObjectWrapOptions &options,
- QScriptValueImpl *out)
-{
- for (int i = 0; i < wrappers.size(); ++i) {
- const QScriptQObjectWrapperInfo &info = wrappers.at(i);
- if ((info.ownership == ownership) && (info.options == options)) {
- *out = info.object;
- return true;
- }
- }
- return false;
-}
-
-void QScriptQObjectData::registerWrapper(const QScriptValueImpl &wrapper,
- QScriptEngine::ValueOwnership ownership,
- const QScriptEngine::QObjectWrapOptions &options)
-{
- wrappers.append(QScriptQObjectWrapperInfo(wrapper, ownership, options));
-}
-
-void QScriptQObjectData::mark(int generation)
-{
- if (m_connectionManager)
- m_connectionManager->mark(generation);
-
- {
- QList<QScriptQObjectWrapperInfo>::iterator it;
- for (it = wrappers.begin(); it != wrappers.end(); ) {
- const QScriptQObjectWrapperInfo &info = *it;
- if (info.object.isMarked(generation)) {
- ++it;
- } else {
- it = wrappers.erase(it);
- }
- }
- }
-}
-
-QT_END_NAMESPACE
-
-#include "qscriptextqobject.moc"
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptextqobject_p.h b/src/script/qscriptextqobject_p.h
deleted file mode 100644
index 537fa49..0000000
--- a/src/script/qscriptextqobject_p.h
+++ /dev/null
@@ -1,447 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTEXTQOBJECT_P_H
-#define QSCRIPTEXTQOBJECT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QT_NO_QOBJECT
-
-#include "qscriptecmacore_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptclassdata_p.h"
-#include "qscriptfunction_p.h"
-#include "qscriptengine.h"
-#include "qscriptmemberfwd_p.h"
-
-#include <QtCore/QHash>
-#include <QtCore/QPointer>
-#include <QtCore/QObject>
-#include <QtCore/QVariant>
-#include <QtCore/QVarLengthArray>
-#include <QtCore/QVector>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-class QObjectConnectionManager;
-
-class ExtQObject: public Ecma::Core
-{
-public:
- ExtQObject(QScriptEnginePrivate *engine);
- virtual ~ExtQObject();
-
- virtual void execute(QScriptContextPrivate *context);
-
- class Instance: public QScriptObjectData {
- public:
- Instance() : ownership(QScriptEngine::QtOwnership) { }
- virtual void finalize(QScriptEnginePrivate *engine);
- virtual ~Instance() {}
-
- static Instance *get(const QScriptValueImpl &object, QScriptClassInfo *klass = 0);
-
- public:
- QPointer<QObject> value;
- QScriptEngine::ValueOwnership ownership;
- QScriptEngine::QObjectWrapOptions options;
- };
-
- inline Instance *get(const QScriptValueImpl &object) const
- { return Instance::get(object, classInfo()); }
-
- void newQObject(QScriptValueImpl *result, QObject *value,
- QScriptEngine::ValueOwnership ownership = QScriptEngine::QtOwnership,
- const QScriptEngine::QObjectWrapOptions &options = 0);
-
-protected:
- static QScriptValueImpl method_findChild(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
- static QScriptValueImpl method_findChildren(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
- static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
-};
-
-class QtFunction: public QScriptFunction
-{
-public:
- QtFunction(const QScriptValueImpl &object, int initialIndex, bool maybeOverloaded)
- : m_object(object), m_initialIndex(initialIndex),
- m_maybeOverloaded(maybeOverloaded)
- { }
-
- virtual ~QtFunction() { }
-
- virtual void execute(QScriptContextPrivate *context);
-
- virtual Type type() const { return QScriptFunction::Qt; }
-
- virtual QString functionName() const;
-
- virtual void mark(QScriptEnginePrivate *engine, int generation);
-
- inline QScriptValueImpl object() const { return m_object; }
-
- inline QObject *qobject() const {
- if (!m_object.isQObject())
- return 0;
- return m_object.toQObject();
- }
-
- inline const QMetaObject *metaObject() const {
- if (!m_object.isQObject())
- return 0;
- QObject *qobj = m_object.toQObject();
- if (!qobj)
- return 0;
- return qobj->metaObject();
- }
-
- int mostGeneralMethod(QMetaMethod *out = 0) const;
- QList<int> overloadedIndexes() const;
-
- inline int initialIndex() const { return m_initialIndex; }
- inline bool maybeOverloaded() const { return m_maybeOverloaded; }
-
-private:
- QScriptValueImpl m_object;
- int m_initialIndex;
- bool m_maybeOverloaded;
-};
-
-class ExtQMetaObject: public Ecma::Core
-{
-public:
- ExtQMetaObject(QScriptEnginePrivate *engine);
- virtual ~ExtQMetaObject();
-
- virtual void execute(QScriptContextPrivate *context);
-
- class Instance: public QScriptFunction {
- public:
- Instance() : value(0) { }
- virtual ~Instance() { }
-
- static Instance *get(const QScriptValueImpl &object, QScriptClassInfo *klass);
-
- virtual void execute(QScriptContextPrivate *context);
-
- public:
- const QMetaObject *value;
- QScriptValueImpl ctor;
- QScriptValueImpl prototype;
- };
-
- inline Instance *get(const QScriptValueImpl &object) const
- { return Instance::get(object, classInfo()); }
-
- void newQMetaObject(QScriptValueImpl *result, const QMetaObject *value,
- const QScriptValueImpl &ctor = QScriptValueImpl());
-
-protected:
- static QScriptValueImpl method_className(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo);
-};
-
-} // namespace QScript
-
-struct QScriptQObjectWrapperInfo
-{
- QScriptQObjectWrapperInfo(const QScriptValueImpl &obj,
- QScriptEngine::ValueOwnership own,
- const QScriptEngine::QObjectWrapOptions &opt)
- : object(obj), ownership(own), options(opt) {}
-
- QScriptValueImpl object;
- QScriptEngine::ValueOwnership ownership;
- QScriptEngine::QObjectWrapOptions options;
-};
-
-class QScriptQObjectData // : public QObjectUserData
-{
-public:
- QScriptQObjectData();
- ~QScriptQObjectData();
-
- bool addSignalHandler(QObject *sender,
- int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &slot,
- const QScriptValueImpl &senderWrapper = QScriptValueImpl());
- bool removeSignalHandler(QObject *sender,
- int signalIndex,
- const QScriptValueImpl &receiver,
- const QScriptValueImpl &slot);
-
- bool findWrapper(QScriptEngine::ValueOwnership ownership,
- const QScriptEngine::QObjectWrapOptions &options,
- QScriptValueImpl *out);
- void registerWrapper(const QScriptValueImpl &wrapper,
- QScriptEngine::ValueOwnership ownership,
- const QScriptEngine::QObjectWrapOptions &options);
-
- void mark(int generation);
-
-private:
- QScript::QObjectConnectionManager *m_connectionManager;
- QList<QScriptQObjectWrapperInfo> wrappers;
-};
-
-class QScriptMetaType
-{
-public:
- enum Kind {
- Invalid,
- Variant,
- MetaType,
- Unresolved,
- MetaEnum
- };
-
- inline QScriptMetaType()
- : m_kind(Invalid), m_typeId(0) { }
-
- inline Kind kind() const
- { return m_kind; }
-
- int typeId() const;
-
- inline bool isValid() const
- { return (m_kind != Invalid); }
-
- inline bool isVariant() const
- { return (m_kind == Variant); }
-
- inline bool isMetaType() const
- { return (m_kind == MetaType); }
-
- inline bool isUnresolved() const
- { return (m_kind == Unresolved); }
-
- inline bool isMetaEnum() const
- { return (m_kind == MetaEnum); }
-
- QByteArray name() const;
-
- inline int enumeratorIndex() const
- { Q_ASSERT(isMetaEnum()); return m_typeId; }
-
- inline bool operator==(const QScriptMetaType &other) const
- {
- return (m_kind == other.m_kind) && (m_typeId == other.m_typeId);
- }
-
- static inline QScriptMetaType variant()
- { return QScriptMetaType(Variant); }
-
- static inline QScriptMetaType metaType(int typeId, const QByteArray &name)
- { return QScriptMetaType(MetaType, typeId, name); }
-
- static inline QScriptMetaType metaEnum(int enumIndex, const QByteArray &name)
- { return QScriptMetaType(MetaEnum, enumIndex, name); }
-
- static inline QScriptMetaType unresolved(const QByteArray &name)
- { return QScriptMetaType(Unresolved, /*typeId=*/0, name); }
-
-private:
- inline QScriptMetaType(Kind kind, int typeId = 0, const QByteArray &name = QByteArray())
- : m_kind(kind), m_typeId(typeId), m_name(name) { }
-
- Kind m_kind;
- int m_typeId;
- QByteArray m_name;
-};
-
-class QScriptMetaMethod
-{
-public:
- inline QScriptMetaMethod()
- : m_firstUnresolvedIndex(-1)
- { }
- inline QScriptMetaMethod(const QByteArray &name, const QVector<QScriptMetaType> &types)
- : m_name(name), m_types(types), m_firstUnresolvedIndex(-1)
- {
- QVector<QScriptMetaType>::const_iterator it;
- for (it = m_types.constBegin(); it != m_types.constEnd(); ++it) {
- if ((*it).kind() == QScriptMetaType::Unresolved) {
- m_firstUnresolvedIndex = it - m_types.constBegin();
- break;
- }
- }
- }
- inline bool isValid() const
- { return !m_types.isEmpty(); }
-
- QByteArray name() const
- { return m_name; }
-
- inline QScriptMetaType returnType() const
- { return m_types.at(0); }
-
- inline int argumentCount() const
- { return m_types.count() - 1; }
-
- inline QScriptMetaType argumentType(int arg) const
- { return m_types.at(arg + 1); }
-
- inline bool fullyResolved() const
- { return m_firstUnresolvedIndex == -1; }
-
- inline bool hasUnresolvedReturnType() const
- { return (m_firstUnresolvedIndex == 0); }
-
- inline int firstUnresolvedIndex() const
- { return m_firstUnresolvedIndex; }
-
- inline int count() const
- { return m_types.count(); }
-
- inline QScriptMetaType type(int index) const
- { return m_types.at(index); }
-
- inline QVector<QScriptMetaType> types() const
- { return m_types; }
-
-private:
- QByteArray m_name;
- QVector<QScriptMetaType> m_types;
- int m_firstUnresolvedIndex;
-};
-
-struct QScriptMetaArguments
-{
- int matchDistance;
- int index;
- QScriptMetaMethod method;
- QVarLengthArray<QVariant, 9> args;
-
- inline QScriptMetaArguments(int dist, int idx, const QScriptMetaMethod &mtd,
- const QVarLengthArray<QVariant, 9> &as)
- : matchDistance(dist), index(idx), method(mtd), args(as) { }
- inline QScriptMetaArguments()
- : matchDistance(0), index(-1) { }
-
- inline bool isValid() const
- { return (index != -1); }
-};
-
-class QScriptMetaObject
-{
-public:
- inline QScriptMetaMethod findMethod(int index) const
- {
- return m_methods.value(index);
- }
-
- inline void registerMethod(int index, const QScriptMetaMethod &method)
- {
- m_methods.insert(index, method);
- }
-
- inline bool findMember(QScriptNameIdImpl *nameId, QScript::Member *member) const
- {
- QHash<QScriptNameIdImpl*, QScript::Member>::const_iterator it;
- it = m_members.constFind(nameId);
- if (it == m_members.constEnd())
- return false;
- *member = it.value();
- return true;
- }
-
- inline void registerMember(QScriptNameIdImpl *nameId, const QScript::Member &member)
- {
- m_members.insert(nameId, member);
- }
-
- inline QList<QScriptNameIdImpl*> registeredMemberNames() const
- {
- return m_members.keys();
- }
-
- inline QScriptValueImpl findPropertyAccessor(int index) const
- {
- return m_propertyAccessors.value(index);
- }
-
- inline void registerPropertyAccessor(int index, const QScriptValueImpl &accessor)
- {
- m_propertyAccessors.insert(index, accessor);
- }
-
- inline QList<QScriptValueImpl> registeredPropertyAccessors() const
- {
- return m_propertyAccessors.values();
- }
-
- inline int methodLowerBound(int index) const
- {
- return m_methodBounds.value(index, 0);
- }
-
- inline void setMethodLowerBound(int index, int bound)
- {
- m_methodBounds.insert(index, bound);
- }
-
-private:
- QHash<int, QScriptValueImpl> m_propertyAccessors;
- QHash<int, QScriptMetaMethod> m_methods;
- QHash<int, int> m_methodBounds;
- QHash<QScriptNameIdImpl*, QScript::Member> m_members;
-};
-
-#endif // QT_NO_QOBJECT
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTEXTQOBJECT_P_H
diff --git a/src/script/qscriptextvariant.cpp b/src/script/qscriptextvariant.cpp
deleted file mode 100644
index 33c5edd..0000000
--- a/src/script/qscriptextvariant.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptextvariant_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-#include <QtCore/QtDebug>
-
-#include <QtCore/QStringList>
-
-#include <limits.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript { namespace Ext {
-
-Variant::Variant(QScriptEnginePrivate *eng):
- Ecma::Core(eng, QLatin1String("QVariant"), QScriptClassInfo::VariantType)
-{
- newVariant(&publicPrototype, QVariant());
-
- eng->newConstructor(&ctor, this, publicPrototype);
-
- addPrototypeFunction(QLatin1String("toString"), method_toString, 0);
- addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0);
-}
-
-Variant::~Variant()
-{
-}
-
-Variant::Instance *Variant::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass)
-{
- if (! klass || klass == object.classInfo())
- return static_cast<Instance*> (object.objectData());
-
- return 0;
-}
-
-void Variant::execute(QScriptContextPrivate *context)
-{
- QScriptValueImpl tmp;
- newVariant(&tmp, QVariant());
- context->setReturnValue(tmp);
-}
-
-void Variant::newVariant(QScriptValueImpl *result, const QVariant &value)
-{
- Instance *instance;
- if (!result->isValid()) {
- engine()->newObject(result, publicPrototype, classInfo());
- instance = new Instance();
- result->setObjectData(instance);
- } else {
- Q_ASSERT(result->isObject());
- if (result->classInfo() != classInfo()) {
- result->destroyObjectData();
- result->setClassInfo(classInfo());
- instance = new Instance();
- result->setObjectData(instance);
- } else {
- instance = Instance::get(*result, classInfo());
- }
- }
- instance->value = value;
-}
-
-QScriptValueImpl Variant::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- if (Instance *instance = Instance::get(context->thisObject(), classInfo)) {
- QString result;
- QScriptValueImpl value = method_valueOf(context, eng, classInfo);
- if (value.isObject()) {
- result = instance->value.toString();
- if (result.isEmpty()) {
- result = QString::fromLatin1("QVariant(%0)")
- .arg(QLatin1String(instance->value.typeName()));
- }
- } else {
- result = value.toString();
- }
- return QScriptValueImpl(eng, result);
- }
- return context->throwError(QScriptContext::TypeError,
- QLatin1String("QVariant.prototype.toString"));
-}
-
-QScriptValueImpl Variant::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo)
-{
- if (Instance *instance = Instance::get(context->thisObject(), classInfo)) {
- QVariant v = instance->value;
- switch (v.type ()) {
- case QVariant::Invalid:
- return eng->undefinedValue();
- case QVariant::String:
- return (QScriptValueImpl(eng, v.toString()));
-
- case QVariant::Int:
- return (QScriptValueImpl(v.toInt()));
-
- case QVariant::Bool:
- return (QScriptValueImpl(v.toBool()));
-
- case QVariant::Double:
- return (QScriptValueImpl(v.toDouble())); // ### hmmm
-
- case QVariant::Char:
- return (QScriptValueImpl(v.toChar().unicode()));
-
- case QVariant::UInt:
- return (QScriptValueImpl(v.toUInt()));
-
- default:
- return context->thisObject();
- } // switch
- }
- return context->thisObject();
-}
-
-} } // namespace QScript::Ecma
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptextvariant_p.h b/src/script/qscriptextvariant_p.h
deleted file mode 100644
index cac17e5..0000000
--- a/src/script/qscriptextvariant_p.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTEXTVARIANT_P_H
-#define QSCRIPTEXTVARIANT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/QVariant>
-
-#include "qscriptecmacore_p.h"
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SCRIPT
-
-namespace QScript { namespace Ext {
-
-class Instance;
-
-class Variant: public Ecma::Core
-{
-public:
- Variant(QScriptEnginePrivate *engine);
- virtual ~Variant();
-
- virtual void execute(QScriptContextPrivate *context);
-
- class Instance: public QScriptObjectData {
- public:
- Instance() {}
- virtual ~Instance() {}
-
- static Instance *get(const QScriptValueImpl &object,
- QScriptClassInfo *klass);
-
- public:
- QVariant value;
- };
-
- inline Instance *get(const QScriptValueImpl &object) const
- { return Instance::get(object, classInfo()); }
-
- void newVariant(QScriptValueImpl *result, const QVariant &value);
-
-protected:
- static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
- static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng,
- QScriptClassInfo *classInfo);
-};
-
-} } // namespace QScript::Ext
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif // QSCRIPTEXTVARIANT_P_H
diff --git a/src/script/qscriptfunction.cpp b/src/script/qscriptfunction.cpp
deleted file mode 100644
index 55d5e61..0000000
--- a/src/script/qscriptfunction.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptfunction_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-QT_BEGIN_NAMESPACE
-
-QScriptFunction::~QScriptFunction()
-{
-}
-
-QString QScriptFunction::toString(QScriptContextPrivate *) const
-{
- QString result;
- result += QLatin1String("function () { [native] }");
- return result;
-}
-
-QString QScriptFunction::fileName() const
-{
- return QString();
-}
-
-QString QScriptFunction::functionName() const
-{
- return QString();
-}
-
-int QScriptFunction::startLineNumber() const
-{
- return -1;
-}
-
-int QScriptFunction::endLineNumber() const
-{
- return -1;
-}
-
-void QScriptFunction::mark(QScriptEnginePrivate *engine, int generation)
-{
- for (int i = 0; i < formals.count(); ++i)
- engine->markString(formals.at(i), generation);
-}
-
-// public API function
-void QScript::CFunction::execute(QScriptContextPrivate *context)
-{
- QScriptEnginePrivate *eng_p = context->engine();
-
- context->m_result = eng_p->undefinedValue();
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionEntry(context);
-#endif
-
- QScriptContext *publicContext = QScriptContextPrivate::get(eng_p->currentContext());
- QScriptEngine *publicEngine = QScriptEnginePrivate::get(eng_p);
- QScriptValueImpl result = eng_p->toImpl((*m_funPtr)(publicContext, publicEngine));
- if (result.isValid() && !eng_p->shouldAbort()
- && (context->state() == QScriptContext::NormalState)) {
- context->m_result = result;
- }
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionExit(context);
-#endif
-}
-
-QString QScript::CFunction::functionName() const
-{
- return QString();
-}
-
-// internal API function
-void QScript::C2Function::execute(QScriptContextPrivate *context)
-{
- QScriptEnginePrivate *eng_p = context->engine();
-
- bool blocked = eng_p->blockGC(true);
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionEntry(context);
-#endif
-
- context->m_result = (*m_funPtr)(context, eng_p, m_classInfo);
- Q_ASSERT(context->m_result.isValid());
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionExit(context);
-#endif
-
- eng_p->blockGC(blocked);
-}
-
-QString QScript::C2Function::functionName() const
-{
- if (!m_name.isEmpty())
- return m_name;
- return QString();
-}
-
-void QScript::C3Function::execute(QScriptContextPrivate *context)
-{
- QScriptEnginePrivate *eng_p = context->engine();
-
- context->m_result = eng_p->undefinedValue();
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionEntry(context);
-#endif
-
- QScriptContext *publicContext = QScriptContextPrivate::get(eng_p->currentContext());
- QScriptEngine *publicEngine = QScriptEnginePrivate::get(eng_p);
- QScriptValueImpl result = eng_p->toImpl((*m_funPtr)(publicContext, publicEngine, m_arg));
- if (result.isValid() && !eng_p->shouldAbort())
- context->m_result = result;
-
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- eng_p->notifyFunctionExit(context);
-#endif
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptfunction_p.h b/src/script/qscriptfunction_p.h
deleted file mode 100644
index ec79f32..0000000
--- a/src/script/qscriptfunction_p.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTFUNCTION_P_H
-#define QSCRIPTFUNCTION_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptobjectdata_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptglobals_p.h"
-#include "qscriptnodepool_p.h"
-
-#include <QtCore/QList>
-
-#ifndef QT_NO_QOBJECT
-# include <QtCore/QPointer>
-# include <QtCore/QMetaMethod>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QScriptContext;
-class QScriptContextPrivate;
-class QScriptNameIdImpl;
-
-class QScriptFunction: public QScriptObjectData
-{
-public:
- enum Type {
- Unknown,
- Script,
- C,
- C2,
- C3,
- Qt,
- QtProperty
- };
-
- QScriptFunction(int len = 0)
- : length(len)
- { }
- virtual ~QScriptFunction();
-
- virtual void execute(QScriptContextPrivate *context) = 0;
- virtual QString toString(QScriptContextPrivate *context) const;
-
- virtual Type type() const { return Unknown; }
-
- // name of the file the function is defined in
- virtual QString fileName() const;
-
- virtual QString functionName() const;
-
- virtual int startLineNumber() const;
-
- virtual int endLineNumber() const;
-
- virtual void mark(QScriptEnginePrivate *engine, int generation);
-
-public: // ### private
- int length;
- QList<QScriptNameIdImpl*> formals;
-};
-
-namespace QScript {
-
-// public API function
-class CFunction: public QScriptFunction
-{
-public:
- CFunction(QScriptFunctionSignature funPtr, int length)
- : QScriptFunction(length), m_funPtr(funPtr)
- { }
-
- virtual ~CFunction() { }
-
- virtual void execute(QScriptContextPrivate *context);
-
- virtual Type type() const { return QScriptFunction::C; }
-
- virtual QString functionName() const;
-
-private:
- QScriptFunctionSignature m_funPtr;
-};
-
-// internal API function
-class C2Function: public QScriptFunction
-{
-public:
- C2Function(QScriptInternalFunctionSignature funPtr, int length,
- QScriptClassInfo *classInfo, const QString &name)
- : QScriptFunction(length), m_funPtr(funPtr),
- m_classInfo(classInfo), m_name(name)
- { }
-
- virtual ~C2Function() {}
-
- virtual void execute(QScriptContextPrivate *context);
-
- virtual Type type() const { return QScriptFunction::C2; }
-
- virtual QString functionName() const;
-
-private:
- QScriptInternalFunctionSignature m_funPtr;
- QScriptClassInfo *m_classInfo;
- QString m_name;
-};
-
-class C3Function: public QScriptFunction
-{
-public:
- C3Function(QScriptFunctionWithArgSignature funPtr, void *arg, int length)
- : QScriptFunction(length), m_funPtr(funPtr), m_arg(arg)
- { }
-
- virtual ~C3Function() { }
-
- virtual void execute(QScriptContextPrivate *context);
-
- virtual Type type() const { return QScriptFunction::C3; }
-
-private:
- QScriptFunctionWithArgSignature m_funPtr;
- void *m_arg;
-};
-
-namespace AST {
- class FunctionExpression;
-}
-
-// implemented in qscriptcontext_p.cpp
-class ScriptFunction: public QScriptFunction
-{
-public:
- ScriptFunction(AST::FunctionExpression *definition, NodePool *astPool):
- m_definition(definition), m_astPool(astPool), m_compiledCode(0) {}
-
- virtual ~ScriptFunction() {}
-
- virtual void execute(QScriptContextPrivate *context);
-
- virtual QString toString(QScriptContextPrivate *context) const;
-
- virtual Type type() const
- { return QScriptFunction::Script; }
-
- virtual QString fileName() const;
-
- virtual QString functionName() const;
-
- virtual int startLineNumber() const;
-
- virtual int endLineNumber() const;
-
-private:
- AST::FunctionExpression *m_definition;
- QExplicitlySharedDataPointer<NodePool> m_astPool;
- Code *m_compiledCode;
-};
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif // QSCRIPTFUNCTION_P_H
diff --git a/src/script/qscriptgc_p.h b/src/script/qscriptgc_p.h
deleted file mode 100644
index 6ded5bd..0000000
--- a/src/script/qscriptgc_p.h
+++ /dev/null
@@ -1,317 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTGC_P_H
-#define QSCRIPTGC_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/QtDebug>
-#include <new>
-
-#include "qscriptmemorypool_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-class GCBlock
-{
-public:
- GCBlock *next;
-
- union {
- int generation;
- uint flags;
- };
-
-public:
- inline GCBlock(GCBlock *n):
- next(n), flags(0) {}
-
- inline void *data()
- { return reinterpret_cast<char *>(this) + sizeof(GCBlock); }
-
- inline static GCBlock *get(void *ptr)
- {
- char *where = reinterpret_cast<char *>(ptr);
- return reinterpret_cast<GCBlock *>(where - sizeof(GCBlock));
- }
-};
-
-template <typename _Tp>
-class GCAlloc
-{
-private:
- int m_new_allocated_blocks;
- int m_free_blocks;
- int m_new_allocated_extra_bytes;
- GCBlock *m_head;
- GCBlock *m_current;
- GCBlock *m_free;
- bool m_blocked_gc;
- bool m_force_gc;
- bool m_sweeping;
- MemoryPool pool;
- _Tp trivial;
-
-public:
- enum { MaxNumberOfBlocks = 1 << 14 };
- enum { MaxNumberOfExtraBytes = 0x800000 };
-
-public:
- inline GCAlloc():
- m_new_allocated_blocks(0),
- m_free_blocks(0),
- m_new_allocated_extra_bytes(0),
- m_head(0),
- m_current(0),
- m_free(0),
- m_blocked_gc(false),
- m_force_gc(false),
- m_sweeping(false) {
- trivial.reset();
- }
-
- inline ~GCAlloc() {
- }
-
- inline void destruct() {
- m_sweeping = true;
- GCBlock *blk = m_free;
-
- if (! blk) {
- blk = m_head;
- m_head = 0;
- }
-
- while (blk) {
- GCBlock *was = blk;
- blk = blk->next;
-
- Q_ASSERT(was->data());
- _Tp *data = reinterpret_cast<_Tp*>(was->data());
- data->~_Tp();
- blk->~GCBlock();
-
- if (! blk && m_head) {
- blk = m_head;
- m_head = 0;
- }
- }
- m_sweeping = false;
- }
-
- inline int newAllocatedBlocks() const { return m_new_allocated_blocks; }
- inline int freeBlocks() const { return m_free_blocks; }
-
- inline _Tp *operator()(int generation)
- {
- GCBlock *previous = m_current;
- void *where = 0;
-
- if (! m_free) {
- Q_ASSERT (m_free_blocks == 0);
- where = pool.allocate(sizeof(GCBlock) + sizeof(_Tp));
- ++m_new_allocated_blocks;
- (void) new (reinterpret_cast<char*>(where) + sizeof(GCBlock)) _Tp();
- } else {
- --m_free_blocks;
- where = m_free;
- m_free = m_free->next;
-
- if (! m_free)
- m_force_gc = true;
- }
-
- m_current = new (where) GCBlock(0);
-
- if (! previous) {
- Q_ASSERT(! m_head);
- m_head = m_current;
- } else {
- previous->next = m_current;
- }
- m_current->generation = generation;
-
- return reinterpret_cast<_Tp*> (m_current->data());
- }
-
- inline bool blocked() const
- {
- return m_blocked_gc;
- }
-
- inline bool sweeping() const
- {
- return m_sweeping;
- }
-
- inline bool blockGC(bool block)
- {
- bool was = m_blocked_gc;
- m_blocked_gc = block;
- return was;
- }
-
- inline void requestGC()
- {
- m_force_gc = true;
- }
-
- inline void adjustBytesAllocated(int bytes)
- { m_new_allocated_extra_bytes += bytes; }
-
- inline bool poll()
- {
- if (m_blocked_gc || ! m_head)
- return false;
-
- else if (m_force_gc) {
- m_force_gc = false;
- return true;
- }
-
- else if (m_free && ! m_free->next)
- return true;
-
- return (m_new_allocated_blocks >= MaxNumberOfBlocks)
- || ((m_new_allocated_extra_bytes >= MaxNumberOfExtraBytes)
- && (m_new_allocated_blocks > 0));
- }
-
- inline int generation(_Tp *ptr) const
- { return GCBlock::get(ptr)->generation; }
-
- inline GCBlock *head() const
- { return m_head; }
-
- void sweep(int generation)
- {
- m_sweeping = true;
- GCBlock *blk = m_head;
- m_current = 0;
-
- m_new_allocated_blocks = 0;
- m_new_allocated_extra_bytes = 0;
-
- while (blk != 0) {
- if (blk->generation != generation) {
- if (m_current)
- m_current->next = blk->next;
-
- GCBlock *tmp = blk;
- blk = blk->next; // advance the pointer
-
- tmp->next = m_free; // prepend the node to the free list...
- m_free = tmp;
- ++m_free_blocks;
-
- if (m_free == m_head)
- m_head = blk;
-
- _Tp *data = reinterpret_cast<_Tp *>(tmp->data());
- data->finalize();
- tmp->~GCBlock();
- } else {
- m_current = blk;
- blk = blk->next;
- }
- }
-
- if (! m_current)
- m_head = m_current;
- m_sweeping = false;
- }
-
- class const_iterator
- {
- public:
- typedef _Tp value_type;
- typedef const _Tp *pointer;
- typedef const _Tp &reference;
- inline const_iterator() : i(0) { }
- inline const_iterator(GCBlock *block) : i(block) { }
- inline const_iterator(const const_iterator &o)
- { i = reinterpret_cast<const const_iterator &>(o).i; }
-
- inline const _Tp *data() const { return reinterpret_cast<_Tp*>(i->data()); }
- inline const _Tp &value() const { return *reinterpret_cast<_Tp*>(i->data()); }
- inline const _Tp &operator*() const { return *reinterpret_cast<_Tp*>(i->data()); }
- inline const _Tp *operator->() const { return reinterpret_cast<_Tp*>(i->data()); }
- inline bool operator==(const const_iterator &o) const { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const { return i != o.i; }
-
- inline const_iterator &operator++() {
- i = i->next;
- return *this;
- }
- private:
- GCBlock *i;
- };
- friend class const_iterator;
-
- inline const_iterator constBegin() const { return const_iterator(m_head); }
- inline const_iterator constEnd() const { return const_iterator(0); }
-
-private:
- Q_DISABLE_COPY(GCAlloc)
-};
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPT_GC_H
diff --git a/src/script/qscriptglobals_p.h b/src/script/qscriptglobals_p.h
deleted file mode 100644
index c4bec42..0000000
--- a/src/script/qscriptglobals_p.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTGLOBALS_P_H
-#define QSCRIPTGLOBALS_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-class QScriptValue;
-class QScriptValueImpl;
-class QScriptClassInfo;
-class QScriptEngine;
-class QScriptEnginePrivate;
-class QScriptContext;
-class QScriptContextPrivate;
-
-typedef QScriptValueImpl (*QScriptInternalFunctionSignature)(QScriptContextPrivate *, QScriptEnginePrivate *, QScriptClassInfo *);
-typedef QScriptValue (*QScriptFunctionSignature)(QScriptContext *, QScriptEngine *);
-typedef QScriptValue (*QScriptFunctionWithArgSignature)(QScriptContext *, QScriptEngine *, void *);
-
-namespace QScript {
-
-enum Type {
- InvalidType,
- // standard types
- UndefinedType,
- NullType,
- BooleanType,
- StringType,
- NumberType,
- ObjectType,
- // internal types
- IntegerType,
- ReferenceType,
- PointerType,
- LazyStringType
-};
-
-enum AccessMode {
- Read = 0x01,
- Write = 0x02,
- ReadWrite = 0x03
-};
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif // QSCRIPTGLOBALS_P_H
diff --git a/src/script/qscriptmember_p.h b/src/script/qscriptmember_p.h
deleted file mode 100644
index ac98432..0000000
--- a/src/script/qscriptmember_p.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTMEMBER_P_H
-#define QSCRIPTMEMBER_P_H
-
-#include "qscriptmemberfwd_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-inline void QScript::Member::resetFlags(uint flags)
-{
- m_flags = flags;
-}
-
-inline void QScript::Member::setFlags(uint flags)
-{
- m_flags |= flags;
-}
-
-inline void QScript::Member::unsetFlags(uint flags)
-{
- m_flags &= ~flags;
-}
-
-inline uint QScript::Member::flags() const
-{
- return m_flags;
-}
-
-inline bool QScript::Member::testFlags(uint mask) const
-{
- return m_flags & mask;
-}
-
-inline bool QScript::Member::isValid() const
-{
- return m_flags & 0x00000300;
-}
-
-inline bool QScript::Member::isWritable() const
-{
- return !(m_flags & QScriptValue::ReadOnly);
-}
-
-inline bool QScript::Member::isDeletable() const
-{
- return !(m_flags & QScriptValue::Undeletable);
-}
-
-inline bool QScript::Member::dontEnum() const
-{
- return m_flags & QScriptValue::SkipInEnumeration;
-}
-
-inline bool QScript::Member::isObjectProperty() const
-{
- return m_flags & ObjectProperty;
-}
-
-inline bool QScript::Member::isNativeProperty() const
-{
- return m_flags & NativeProperty;
-}
-
-inline bool QScript::Member::isUninitializedConst() const
-{
- return m_flags & UninitializedConst;
-}
-
-inline bool QScript::Member::isGetter() const
-{
- return m_flags & QScriptValue::PropertyGetter;
-}
-
-inline bool QScript::Member::isSetter() const
-{
- return m_flags & QScriptValue::PropertySetter;
-}
-
-inline bool QScript::Member::isGetterOrSetter() const
-{
- return m_flags & (QScriptValue::PropertyGetter | QScriptValue::PropertySetter);
-}
-
-inline int QScript::Member::id() const
-{
- return m_id;
-}
-
-inline QScriptNameIdImpl *QScript::Member::nameId() const
-{
- return m_nameId;
-}
-
-inline QScript::Member QScript::Member::invalid()
-{
- Member m;
- m.m_flags = 0;
- return m;
-}
-
-inline void QScript::Member::invalidate()
-{
- m_flags = 0;
-}
-
-inline void QScript::Member::native(QScriptNameIdImpl *nameId, int id, uint flags)
-{
- Q_ASSERT(! (flags & ObjectProperty));
-
- m_nameId = nameId;
- m_id = id;
- m_flags = flags | NativeProperty;
-}
-
-inline void QScript::Member::object(QScriptNameIdImpl *nameId, int id, uint flags)
-{
- Q_ASSERT(! (flags & NativeProperty));
-
- m_nameId = nameId;
- m_id = id;
- m_flags = flags | ObjectProperty;
-}
-
-inline bool QScript::Member::operator==(const QScript::Member &other) const
-{
- return m_nameId == other.m_nameId;
-}
-
-inline bool QScript::Member::operator!=(const QScript::Member &other) const
-{
- return m_nameId != other.m_nameId;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptmemberfwd_p.h b/src/script/qscriptmemberfwd_p.h
deleted file mode 100644
index 023815a..0000000
--- a/src/script/qscriptmemberfwd_p.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTMEMBERFWD_P_H
-#define QSCRIPTMEMBERFWD_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SCRIPT
-
-class QScriptNameIdImpl;
-
-namespace QScript {
-
- class Member
- {
- public:
- enum PropertyFlag {
- ObjectProperty = 0x00000100, // Stored in the member table
- NativeProperty = 0x00000200,
-
- UninitializedConst = 0x00000800, // NB: shared with QScriptValue::KeepExistingFlags
-
- InternalRange = 0x0000ff00 // Not user-accessible (read as 0, don't change on write)
- };
-
- inline Member() : m_nameId(0), m_id(0), m_flags(0) {}
-
- inline void resetFlags(uint flags);
- inline void setFlags(uint flags);
- inline void unsetFlags(uint flags);
- inline uint flags() const;
- inline bool testFlags(uint mask) const;
-
- inline bool isValid() const;
-
- inline bool isWritable() const;
- inline bool isDeletable() const;
-
- inline bool dontEnum() const;
-
- inline bool isObjectProperty() const;
- inline bool isNativeProperty() const;
-
- inline bool isUninitializedConst() const;
-
- inline bool isGetter() const;
- inline bool isSetter() const;
- inline bool isGetterOrSetter() const;
-
- inline int id() const;
- inline QScriptNameIdImpl *nameId() const;
-
- inline bool operator==(const Member &other) const;
- inline bool operator!=(const Member &other) const;
-
- inline static Member invalid();
- inline void invalidate();
-
- inline void native(QScriptNameIdImpl *nameId, int id, uint flags);
- inline void object(QScriptNameIdImpl *nameId, int id, uint flags);
-
- private:
- QScriptNameIdImpl *m_nameId;
- int m_id;
- uint m_flags;
- };
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptmemorypool_p.h b/src/script/qscriptmemorypool_p.h
deleted file mode 100644
index 2f069ec..0000000
--- a/src/script/qscriptmemorypool_p.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTMEMORYPOOL_P_H
-#define QSCRIPTMEMORYPOOL_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-#include <QtCore/qshareddata.h>
-#include <string.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-class MemoryPool : public QSharedData
-{
-public:
- enum { maxBlockCount = -1 };
- enum { defaultBlockSize = 1 << 12 };
-
- MemoryPool() {
- m_blockIndex = maxBlockCount;
- m_currentIndex = 0;
- m_storage = 0;
- m_currentBlock = 0;
- m_currentBlockSize = 0;
- }
-
- virtual ~MemoryPool() {
- for (int index = 0; index < m_blockIndex + 1; ++index)
- qFree(m_storage[index]);
-
- qFree(m_storage);
- }
-
- char *allocate(int bytes) {
- bytes += (8 - bytes) & 7; // ensure multiple of 8 bytes (maintain alignment)
- if (m_currentBlock == 0 || m_currentBlockSize < m_currentIndex + bytes) {
- ++m_blockIndex;
- m_currentBlockSize = defaultBlockSize << m_blockIndex;
-
- m_storage = reinterpret_cast<char**>(qRealloc(m_storage, sizeof(char*) * (1 + m_blockIndex)));
- m_currentBlock = m_storage[m_blockIndex] = reinterpret_cast<char*>(qMalloc(m_currentBlockSize));
- ::memset(m_currentBlock, 0, m_currentBlockSize);
-
- m_currentIndex = (8 - quintptr(m_currentBlock)) & 7; // ensure first chunk is 64-bit aligned
- Q_ASSERT(m_currentIndex + bytes <= m_currentBlockSize);
- }
-
- char *p = reinterpret_cast<char *>
- (m_currentBlock + m_currentIndex);
-
- m_currentIndex += bytes;
-
- return p;
- }
-
- int bytesAllocated() const {
- int bytes = 0;
- for (int index = 0; index < m_blockIndex; ++index)
- bytes += (defaultBlockSize << index);
- bytes += m_currentIndex;
- return bytes;
- }
-
-private:
- int m_blockIndex;
- int m_currentIndex;
- char *m_currentBlock;
- int m_currentBlockSize;
- char **m_storage;
-
-private:
- Q_DISABLE_COPY(MemoryPool)
-};
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptnameid_p.h b/src/script/qscriptnameid_p.h
deleted file mode 100644
index c0d8f6b..0000000
--- a/src/script/qscriptnameid_p.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTNAMEID_P_H
-#define QSCRIPTNAMEID_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-QT_BEGIN_NAMESPACE
-
-class QScriptNameIdImpl
-{
-public:
- QString s;
- uint h;
- QScriptNameIdImpl *next;
- uint used: 1;
- uint persistent: 1;
- uint unique: 1;
- uint pad: 29;
-
- inline QScriptNameIdImpl(const QString &_s):
- s(_s), h(0), next(0), used(0), persistent(0), unique(0), pad(0) { }
-};
-
-QT_END_NAMESPACE
-
-#endif // QSCRIPTNAMEID_P_H
diff --git a/src/script/qscriptnodepool_p.h b/src/script/qscriptnodepool_p.h
deleted file mode 100644
index 5e1876c..0000000
--- a/src/script/qscriptnodepool_p.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTNODEPOOL_P_H
-#define QSCRIPTNODEPOOL_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/QHash>
-#include <QtCore/QString>
-
-#include "qscriptmemorypool_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QScriptEnginePrivate;
-
-namespace QScript {
-
-namespace AST {
-class Node;
-} // namespace AST
-
-class Code;
-class CompilationUnit;
-
-template <typename NodeType>
-inline NodeType *makeAstNode(MemoryPool *storage)
-{
- NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType();
- return node;
-}
-
-template <typename NodeType, typename Arg1>
-inline NodeType *makeAstNode(MemoryPool *storage, Arg1 arg1)
-{
- NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(arg1);
- return node;
-}
-
-template <typename NodeType, typename Arg1, typename Arg2>
-inline NodeType *makeAstNode(MemoryPool *storage, Arg1 arg1, Arg2 arg2)
-{
- NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(arg1, arg2);
- return node;
-}
-
-template <typename NodeType, typename Arg1, typename Arg2, typename Arg3>
-inline NodeType *makeAstNode(MemoryPool *storage, Arg1 arg1, Arg2 arg2, Arg3 arg3)
-{
- NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(arg1, arg2, arg3);
- return node;
-}
-
-template <typename NodeType, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
-inline NodeType *makeAstNode(MemoryPool *storage, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
-{
- NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(arg1, arg2, arg3, arg4);
- return node;
-}
-
-class NodePool : public MemoryPool
-{
-public:
- NodePool(const QString &fileName, QScriptEnginePrivate *engine);
- virtual ~NodePool();
-
- Code *createCompiledCode(AST::Node *node, CompilationUnit &compilation);
-
- inline QString fileName() const { return m_fileName; }
- inline QScriptEnginePrivate *engine() const { return m_engine; }
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- inline qint64 id() const { return m_id; }
-#endif
-
-private:
- QHash<AST::Node*, Code*> m_codeCache;
- QString m_fileName;
- QScriptEnginePrivate *m_engine;
-#ifndef Q_SCRIPT_NO_EVENT_NOTIFY
- qint64 m_id;
-#endif
-
-private:
- Q_DISABLE_COPY(NodePool)
-};
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptobject_p.h b/src/script/qscriptobject_p.h
deleted file mode 100644
index 1ac3c65..0000000
--- a/src/script/qscriptobject_p.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTOBJECT_P_H
-#define QSCRIPTOBJECT_P_H
-
-#include "qscriptobjectfwd_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-inline bool QScriptObject::findMember(QScriptNameIdImpl *nameId,
- QScript::Member *m) const
-{
- const QScript::Member *members = m_members.constData();
- const int size = m_members.size();
-
- const QScript::Member *first = &members[-1];
- const QScript::Member *last = &members[size - 1];
-
- for (const QScript::Member *it = last; it != first; --it) {
- if (it->nameId() == nameId && it->isValid()) {
- *m = *it;
- return true;
- }
- }
-
- return false;
-}
-
-// assumes that m already points to the setter
-inline bool QScriptObject::findGetter(QScript::Member *m) const
-{
- const QScript::Member *members = m_members.constData();
- const QScript::Member *first = &members[-1];
- const QScript::Member *last = &members[m->id() - 1];
-
- for (const QScript::Member *it = last; it != first; --it) {
- if (it->nameId() == m->nameId() && it->isValid() && it->isGetter()) {
- *m = *it;
- return true;
- }
- }
-
- return false;
-}
-
-// assumes that m already points to the getter
-inline bool QScriptObject::findSetter(QScript::Member *m) const
-{
- const QScript::Member *members = m_members.constData();
- const QScript::Member *first = &members[-1];
- const QScript::Member *last = &members[m->id() - 1];
-
- for (const QScript::Member *it = last; it != first; --it) {
- if (it->nameId() == m->nameId() && it->isValid() && it->isSetter()) {
- *m = *it;
- return true;
- }
- }
-
- return false;
-}
-
-inline int QScriptObject::memberCount() const
-{
- return m_members.size();
-}
-
-inline void QScriptObject::createMember(QScriptNameIdImpl *nameId,
- QScript::Member *member, uint flags)
-{
- member->object(nameId, m_values.size(), flags);
- m_members.append(*member);
- m_values.append(QScriptValueImpl());
-}
-
-inline void QScriptObject::member(int index, QScript::Member *member)
-{
- *member = m_members[index];
-}
-
-inline void QScriptObject::put(const QScript::Member &m, const QScriptValueImpl &v)
-{
- m_values[m.id()] = v;
-}
-
-inline QScriptValueImpl &QScriptObject::reference(const QScript::Member &m)
-{
- return m_values[m.id()];
-}
-
-inline void QScriptObject::get(const QScript::Member &m, QScriptValueImpl *v)
-{
- Q_ASSERT(m.isObjectProperty());
- *v = m_values[m.id()];
-}
-
-inline void QScriptObject::removeMember(const QScript::Member &member)
-{
- m_members[member.id()].invalidate();
- m_values[member.id()].invalidate();
-}
-
-inline QScriptObject::~QScriptObject()
-{
- finalize();
-}
-
-inline void QScriptObject::finalize()
-{
- finalizeData();
-}
-
-inline void QScriptObject::finalizeData()
-{
- if (m_data) {
- m_data->finalize(m_class->engine());
- delete m_data;
- m_data = 0;
- }
-}
-
-inline void QScriptObject::reset()
-{
- m_prototype.invalidate();
- m_scope.invalidate();
- m_internalValue.invalidate();
- m_members.resize(0);
- m_values.resize(0);
- m_data = 0;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptobjectdata_p.h b/src/script/qscriptobjectdata_p.h
deleted file mode 100644
index ed4e5fd..0000000
--- a/src/script/qscriptobjectdata_p.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTOBJECTDATA_P_H
-#define QSCRIPTOBJECTDATA_P_H
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptEnginePrivate;
-
-class QScriptObjectData
-{
-protected:
- inline QScriptObjectData() {}
-
-public:
- virtual void finalize(QScriptEnginePrivate *) {}
- virtual ~QScriptObjectData() {}
-
-private:
- Q_DISABLE_COPY(QScriptObjectData)
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptobjectfwd_p.h b/src/script/qscriptobjectfwd_p.h
deleted file mode 100644
index 0cbec1f..0000000
--- a/src/script/qscriptobjectfwd_p.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTOBJECTFWD_P_H
-#define QSCRIPTOBJECTFWD_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptbuffer_p.h"
-#include "qscriptmemberfwd_p.h"
-#include "qscriptvalueimplfwd_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QScriptObjectData;
-
-class QScriptObject
-{
-public:
- inline void reset();
- inline ~QScriptObject();
- inline void finalize();
- inline void finalizeData();
-
- inline bool findMember(QScriptNameIdImpl *nameId,
- QScript::Member *m) const;
-
- inline bool findGetter(QScript::Member *m) const;
-
- inline bool findSetter(QScript::Member *m) const;
-
- inline int memberCount() const;
-
- inline void createMember(QScriptNameIdImpl *nameId,
- QScript::Member *member, uint flags);
-
- inline void member(int index, QScript::Member *member);
-
- inline void put(const QScript::Member &m, const QScriptValueImpl &v);
-
- inline QScriptValueImpl &reference(const QScript::Member &m);
-
- inline void get(const QScript::Member &m, QScriptValueImpl *v);
-
- inline void removeMember(const QScript::Member &member);
-
- QScriptValueImpl m_prototype;
- QScriptValueImpl m_scope;
- QScriptValueImpl m_internalValue; // [[value]]
- QScriptObjectData *m_data;
- QScript::Buffer<QScript::Member> m_members;
- QScript::Buffer<QScriptValueImpl> m_values;
- qint64 m_id;
- QScriptClassInfo *m_class;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptrepository_p.h b/src/script/qscriptrepository_p.h
deleted file mode 100644
index 64dbac0..0000000
--- a/src/script/qscriptrepository_p.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTREPOSITORY_P_H
-#define QSCRIPTREPOSITORY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qscriptbuffer_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-template <typename Tp, typename Factory>
-class Repository
-{
-public:
- inline Repository() { cache.reserve(32); }
- inline ~Repository() { qDeleteAll(cache); }
-
- inline Tp *get()
- {
- if (cache.isEmpty())
- return Factory::create();
-
- return cache.takeLast();
- }
-
- inline void release(Tp *item)
- { cache.append(item); }
-
-private:
- Buffer<Tp*> cache;
-
-private:
- Q_DISABLE_COPY(Repository)
-};
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/script/qscriptstring.h b/src/script/qscriptstring.h
deleted file mode 100644
index d2fecd8..0000000
--- a/src/script/qscriptstring.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTSTRING_H
-#define QSCRIPTSTRING_H
-
-#include <QtCore/qstring.h>
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Script)
-
-class QScriptEngine;
-class QScriptStringPrivate;
-
-class Q_SCRIPT_EXPORT QScriptString
-{
-public:
- QScriptString();
- QScriptString(const QScriptString &other);
- ~QScriptString();
-
- QScriptString &operator=(const QScriptString &other);
-
- bool isValid() const;
-
- bool operator==(const QScriptString &other) const;
- bool operator!=(const QScriptString &other) const;
-
- QString toString() const;
- operator QString() const;
-
-private:
- QScriptStringPrivate *d_ptr;
-
- Q_DECLARE_PRIVATE(QScriptString)
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QT_NO_SCRIPT
-#endif // QSCRIPTSTRING_H
diff --git a/src/script/qscriptstring_p.h b/src/script/qscriptstring_p.h
deleted file mode 100644
index 34f9dec..0000000
--- a/src/script/qscriptstring_p.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTSTRING_P_H
-#define QSCRIPTSTRING_P_H
-
-#include <QtCore/qatomic.h>
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptNameIdImpl;
-class QScriptEnginePrivate;
-class QScriptString;
-
-class QScriptStringPrivate
-{
- Q_DECLARE_PUBLIC(QScriptString)
-public:
- QScriptStringPrivate();
-
- static QScriptStringPrivate *create();
- static QScriptStringPrivate *get(const QScriptString &q);
- static void init(QScriptString &q, QScriptStringPrivate *d);
-
- QBasicAtomicInt ref;
- QScriptNameIdImpl *nameId;
- QScriptEnginePrivate *engine;
- QScriptString *q_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptsyntaxchecker_p.h b/src/script/qscriptsyntaxchecker_p.h
deleted file mode 100644
index 18f0611..0000000
--- a/src/script/qscriptsyntaxchecker_p.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTSYNTAXCHECKER_H
-#define QSCRIPTSYNTAXCHECKER_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qstring.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptgrammar_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-class Lexer;
-
-class SyntaxChecker: protected QScriptGrammar
-{
-public:
- enum State {
- Error,
- Intermediate,
- Valid
- };
-
- struct Result {
- Result(State s, int ln, int col, const QString &msg)
- : state(s), errorLineNumber(ln), errorColumnNumber(col),
- errorMessage(msg) {}
- State state;
- int errorLineNumber;
- int errorColumnNumber;
- QString errorMessage;
- };
-
- SyntaxChecker();
- ~SyntaxChecker();
-
- Result checkSyntax(const QString &code);
-
-protected:
- bool automatic(QScript::Lexer *lexer, int token) const;
- inline void reallocateStack();
-
-protected:
- int tos;
- int stack_size;
- int *state_stack;
-};
-
-inline void SyntaxChecker::reallocateStack()
-{
- if (! stack_size)
- stack_size = 128;
- else
- stack_size <<= 1;
-
- state_stack = reinterpret_cast<int*> (qRealloc(state_stack, stack_size * sizeof(int)));
-}
-
-} // namespace QScript
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptsyntaxcheckresult_p.h b/src/script/qscriptsyntaxcheckresult_p.h
deleted file mode 100644
index fc5cb42..0000000
--- a/src/script/qscriptsyntaxcheckresult_p.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTSYNTAXCHECKRESULT_P_H
-#define QSCRIPTSYNTAXCHECKRESULT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QT_NO_SCRIPT
-
-#include <QtCore/qatomic.h>
-#include <QtCore/qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-class QScriptSyntaxCheckResultPrivate
-{
-public:
- QScriptSyntaxCheckResultPrivate() { ref = 0; }
- ~QScriptSyntaxCheckResultPrivate() {}
-
- QScriptSyntaxCheckResult::State state;
- int errorColumnNumber;
- int errorLineNumber;
- QString errorMessage;
- QBasicAtomicInt ref;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptvalue_p.h b/src/script/qscriptvalue_p.h
deleted file mode 100644
index 8463ed2..0000000
--- a/src/script/qscriptvalue_p.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTVALUE_P_H
-#define QSCRIPTVALUE_P_H
-
-#include "qscriptvaluefwd_p.h"
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SCRIPT
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-inline QScriptValuePrivate::QScriptValuePrivate()
-{
- engine = 0;
- ref = 0;
-}
-
-inline QScriptValuePrivate::~QScriptValuePrivate()
-{
- if (value.type() == QScript::LazyStringType)
- delete value.m_lazy_string_value;
-}
-
-inline QScriptValuePrivate *QScriptValuePrivate::create()
-{
- return new QScriptValuePrivate();
-}
-
-inline QScriptValuePrivate *QScriptValuePrivate::get(const QScriptValue &value)
-{
- return const_cast<QScriptValuePrivate*>(value.d_func());
-}
-
-inline QScriptValueImpl QScriptValuePrivate::valueOf(const QScriptValue &value)
-{
- QScriptValuePrivate *p = const_cast<QScriptValuePrivate*>(value.d_func());
- if (!p)
- return QScriptValueImpl();
- return p->value;
-}
-
-inline void QScriptValuePrivate::init(QScriptValue &value, QScriptValuePrivate *p)
-{
- value.d_ptr = p;
- value.d_ptr->ref.ref();
-}
-
-inline void QScriptValuePrivate::invalidate()
-{
- engine = 0;
- value.invalidate();
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptvaluefwd_p.h b/src/script/qscriptvaluefwd_p.h
deleted file mode 100644
index d57786d..0000000
--- a/src/script/qscriptvaluefwd_p.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTVALUEFWD_P_H
-#define QSCRIPTVALUEFWD_P_H
-
-#include <QtCore/qatomic.h>
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptvalueimplfwd_p.h"
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptValuePrivate
-{
-public:
- inline QScriptValuePrivate();
- inline ~QScriptValuePrivate();
-
- static inline QScriptValuePrivate *create();
-
- static inline QScriptValuePrivate *get(const QScriptValue &value);
-
- static inline QScriptValueImpl valueOf(const QScriptValue &value);
-
- static inline void init(QScriptValue &value, QScriptValuePrivate *p);
-
- inline void invalidate();
-
- QScriptEngine *engine;
- QScriptValueImpl value;
- QBasicAtomicInt ref;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptvalueimpl.cpp b/src/script/qscriptvalueimpl.cpp
deleted file mode 100644
index 7c7b711..0000000
--- a/src/script/qscriptvalueimpl.cpp
+++ /dev/null
@@ -1,450 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptvalueimpl_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-QT_BEGIN_NAMESPACE
-
-static void dfs(QScriptObject *instance, QHash<QScriptObject*, int> &dfn, int n)
-{
- bool found = dfn.contains(instance);
- dfn[instance] = n;
-
- if (found)
- return;
-
- if (instance->m_prototype.isObject())
- dfs (instance->m_prototype.m_object_value, dfn, n + 1);
-
- if (instance->m_scope.isObject())
- dfs (instance->m_scope.m_object_value, dfn, n + 1);
-}
-
-
-static bool checkCycle(QScriptObject *instance, const QHash<QScriptObject*, int> &dfn)
-{
- int n = dfn.value(instance);
-
- if (instance->m_prototype.isObject()) {
- if (n >= dfn.value(instance->m_prototype.m_object_value))
- return true;
- }
-
- if (instance->m_scope.isObject()) {
- if (n >= dfn.value(instance->m_scope.m_object_value))
- return true;
- }
-
- return false;
-}
-
-bool QScriptValueImpl::detectedCycle() const
-{
- QHash<QScriptObject*, int> dfn;
- dfs(m_object_value, dfn, 0);
- return checkCycle(m_object_value, dfn);
-}
-
-bool QScriptValueImpl::instanceOf(const QScriptValueImpl &value) const
-{
- if (! isObject() || ! value.isObject() || !value.implementsHasInstance())
- return false;
- return value.hasInstance(*this);
-}
-
-bool QScriptValueImpl::implementsHasInstance() const
-{
- Q_ASSERT(isObject());
- if (isFunction())
- return true;
- if (QScriptClassData *odata = classInfo()->data()) {
- return odata->implementsHasInstance(*this);
- }
- return false;
-}
-
-bool QScriptValueImpl::hasInstance(const QScriptValueImpl &value) const
-{
- Q_ASSERT(isObject());
-
- if (QScriptClassData *odata = classInfo()->data()) {
- if (odata->implementsHasInstance(*this))
- return odata->hasInstance(*this, value);
- }
- if (!isFunction())
- return false;
-
- // [[HasInstance] for function objects
-
- if (!value.isObject())
- return false;
-
- QScriptEnginePrivate *eng = engine();
- QScriptValueImpl proto = property(eng->idTable()->id_prototype);
- if (!proto.isObject()) {
- QScriptContextPrivate *ctx = eng->currentContext();
- ctx->throwTypeError(QLatin1String("instanceof: 'prototype' property is not an object"));
- return false;
- }
-
- QScriptObject *target = proto.m_object_value;
- QScriptValueImpl v = value;
- while (true) {
- v = v.prototype();
- if (!v.isObject())
- break;
- if (target == v.m_object_value)
- return true;
- }
- return false;
-}
-
-bool QScriptValueImpl::resolve_helper(QScriptNameIdImpl *nameId, QScript::Member *member,
- QScriptValueImpl *object, QScriptValue::ResolveFlags mode,
- QScript::AccessMode access) const
-{
- QScriptObject *object_data = m_object_value;
-
- QScriptEnginePrivate *eng_p = engine();
-
- if (nameId == eng_p->idTable()->id___proto__) {
- member->native(nameId, /*id=*/0, QScriptValue::Undeletable);
- *object = *this;
- return true;
- }
-
- // If not found anywhere else, search in the extra members.
- if (QScriptClassData *odata = classInfo()->data()) {
- *object = *this;
-
- if (odata->resolve(*this, nameId, member, object, access))
- return true;
- }
-
- if (mode & QScriptValue::ResolvePrototype) {
- // For values and other non object based types, search in class's prototype
- const QScriptValueImpl &proto = object_data->m_prototype;
-
- if (proto.isObject()
- && proto.resolve(nameId, member, object, mode, access)) {
- return true;
- }
- }
-
- if ((mode & QScriptValue::ResolveScope) && object_data->m_scope.isValid())
- return object_data->m_scope.resolve(nameId, member, object, mode, access);
-
- return false;
-}
-
-void QScriptValueImpl::setProperty(QScriptNameIdImpl *nameId,
- const QScriptValueImpl &value,
- const QScriptValue::PropertyFlags &flags)
-{
- if (!isObject())
- return;
-
- QScriptValueImpl base;
- QScript::Member member;
-
- QScriptValue::ResolveFlags mode = QScriptValue::ResolveLocal;
- // if we are not setting a setter or getter, look in prototype too
- if (!(flags & (QScriptValue::PropertyGetter | QScriptValue::PropertySetter)))
- mode |= QScriptValue::ResolvePrototype;
-
- if (resolve(nameId, &member, &base, mode, QScript::ReadWrite)) {
- // we resolved an existing property with that name
- if (flags & (QScriptValue::PropertyGetter | QScriptValue::PropertySetter)) {
- // setting the getter or setter of a property in this object
- if (member.isNativeProperty()) {
- if (value.isValid()) {
- qWarning("QScriptValue::setProperty() failed: "
- "cannot set getter or setter of native property `%s'",
- qPrintable(nameId->s));
- }
- return;
- }
- if (member.isSetter()) {
- // the property we resolved is a setter
- if (!(flags & QScriptValue::PropertySetter) && !member.isGetter()) {
- // find the getter, if not, create one
- if (!m_object_value->findGetter(&member)) {
- if (!value.isValid())
- return; // don't create property for invalid value
- createMember(nameId, &member, flags);
- }
- }
- } else if (member.isGetter()) {
- // the property we resolved is a getter
- if (!(flags & QScriptValue::PropertyGetter)) {
- // find the setter, if not, create one
- if (!m_object_value->findSetter(&member)) {
- if (!value.isValid())
- return; // don't create property for invalid value
- createMember(nameId, &member, flags);
- }
- }
- } else {
- // the property is a normal property -- change the flags
- uint newFlags = flags & ~QScript::Member::InternalRange;
- newFlags |= QScript::Member::ObjectProperty;
- member.resetFlags(newFlags);
- base.m_object_value->m_members[member.id()].resetFlags(newFlags);
- }
- Q_ASSERT(member.isValid());
- if (!value.isValid()) {
- // remove the property
- removeMember(member);
- return;
- }
- } else {
- // setting the value
- if (member.isGetterOrSetter()) {
- // call the setter
- QScriptValueImpl setter;
- if (member.isObjectProperty() && !member.isSetter()) {
- if (!base.m_object_value->findSetter(&member)) {
- qWarning("QScriptValue::setProperty() failed: "
- "property '%s' has a getter but no setter",
- qPrintable(nameId->s));
- return;
- }
- }
- base.get(member, &setter);
- setter.call(*this, QScriptValueImplList() << value);
- return;
- } else {
- if (base.m_object_value != m_object_value) {
- if (!value.isValid())
- return; // don't create property for invalid value
- createMember(nameId, &member, flags);
- base = *this;
- } else {
- if (!value.isValid()) {
- // remove the property
- removeMember(member);
- return;
- }
- }
- if (flags != QScriptValue::KeepExistingFlags) {
- // change flags
- if (member.isNativeProperty()) {
- qWarning("QScriptValue::setProperty(%s): "
- "cannot change flags of a native property",
- qPrintable(nameId->s));
- } else {
- uint newFlags = member.flags() & QScript::Member::InternalRange;
- newFlags |= flags & ~QScript::Member::InternalRange;
- base.m_object_value->m_members[member.id()].resetFlags(newFlags);
- }
- }
- }
- }
- } else {
- // property does not exist
- if (!value.isValid())
- return; // don't create property for invalid value
- createMember(nameId, &member, flags & ~QScript::Member::InternalRange);
- base = *this;
- }
-
- base.put(member, value);
-}
-
-QVariant QScriptValueImpl::toVariant() const
-{
- switch (m_type) {
- case QScript::InvalidType:
- return QVariant();
-
- case QScript::UndefinedType:
- case QScript::NullType:
- case QScript::PointerType:
- case QScript::ReferenceType:
- break;
-
- case QScript::BooleanType:
- return QVariant(m_bool_value);
-
- case QScript::IntegerType:
- return QVariant(m_int_value);
-
- case QScript::NumberType:
- return QVariant(m_number_value);
-
- case QScript::StringType:
- return QVariant(m_string_value->s);
-
- case QScript::LazyStringType:
- return QVariant(*m_lazy_string_value);
-
- case QScript::ObjectType:
- if (isDate())
- return QVariant(toDateTime());
-
-#ifndef QT_NO_REGEXP
- if (isRegExp())
- return QVariant(toRegExp());
-#endif
- if (isVariant())
- return variantValue();
-
-#ifndef QT_NO_QOBJECT
- if (isQObject())
- return qVariantFromValue(toQObject());
-#endif
- if (isArray())
- return QScriptEnginePrivate::variantListFromArray(*this);
-
- QScriptValueImpl v = engine()->toPrimitive(*this);
- if (!v.isObject())
- return v.toVariant();
- break;
- } // switch
- return QVariant();
-}
-
-QDebug &operator<<(QDebug &d, const QScriptValueImpl &object)
-{
- d.nospace() << "QScriptValue(";
-
- switch (object.type()) {
- case QScript::InvalidType:
- d.nospace() << "Invalid)";
- return d;
-
- case QScript::BooleanType:
- d.nospace() << "bool=" << object.toBoolean();
- break;
-
- case QScript::IntegerType:
- d.nospace() << "int=" << object.toInt32();
- break;
-
- case QScript::NumberType:
- d.nospace() << "qsreal=" << object.toNumber();
- break;
-
- case QScript::LazyStringType:
- case QScript::StringType:
- d.nospace() << "string=" << object.toString();
- break;
-
- case QScript::ReferenceType:
- d.nospace() << "reference";
- break;
-
- case QScript::NullType:
- d.nospace() << "null";
- break;
-
- case QScript::UndefinedType:
- d.nospace() << "undefined";
- break;
-
- case QScript::PointerType:
- d.nospace() << "pointer";
- break;
-
- case QScript::ObjectType:
- d.nospace() << object.classInfo()->name() << ",{";
- QScriptObject *od = object.objectValue();
- for (int i=0; i<od->memberCount(); ++i) {
- if (i != 0)
- d << ',';
-
- QScript::Member m;
- od->member(i, &m);
-
- if (m.isValid() && m.isObjectProperty()) {
- d << object.engine()->toString(m.nameId());
- QScriptValueImpl o;
- od->get(m, &o);
- d.nospace() << QLatin1Char(':')
- << (o.classInfo()
- ? o.classInfo()->name()
- : QLatin1String("?"));
- }
- }
-
- d.nospace() << "} scope={";
- QScriptValueImpl scope = object.scope();
- while (scope.isValid()) {
- Q_ASSERT(scope.isObject());
- d.nospace() << ' ' << scope.objectValue();
- scope = scope.scope();
- }
- d.nospace() << '}';
- break;
- }
-
- d << ')';
- return d;
-}
-
-void QScriptValueImpl::destroyObjectData()
-{
- Q_ASSERT(isObject());
- m_object_value->finalizeData();
-}
-
-bool QScriptValueImpl::isMarked(int generation) const
-{
- if (isString())
- return (m_string_value->used != 0);
- else if (isObject()) {
- QScript::GCBlock *block = QScript::GCBlock::get(m_object_value);
- return (block->generation == generation);
- }
- return false;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptvalueimpl_p.h b/src/script/qscriptvalueimpl_p.h
deleted file mode 100644
index 09dd6cd..0000000
--- a/src/script/qscriptvalueimpl_p.h
+++ /dev/null
@@ -1,786 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTVALUEIMPL_P_H
-#define QSCRIPTVALUEIMPL_P_H
-
-#include "qscriptvalueimplfwd_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptclassinfo_p.h"
-#include "qscriptecmaarray_p.h"
-#include "qscriptecmadate_p.h"
-#include "qscriptecmaerror_p.h"
-#include "qscriptecmaregexp_p.h"
-#include "qscriptextqobject_p.h"
-#include "qscriptextvariant_p.h"
-#include "qscriptvaluefwd_p.h"
-#include "qscriptnameid_p.h"
-#include "qscriptenginefwd_p.h"
-#include "qscriptcontextfwd_p.h"
-
-#include <QtCore/QDateTime>
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-inline QScriptValueImpl::QScriptValueImpl()
- : m_type(QScript::InvalidType) {}
-
-inline QScriptValueImpl::QScriptValueImpl(QScriptValue::SpecialValue val)
-{
- if (val == QScriptValue::NullValue)
- m_type = QScript::NullType;
- else if (val == QScriptValue::UndefinedValue)
- m_type = QScript::UndefinedType;
- else
- m_type = QScript::InvalidType;
-}
-
-inline QScriptValueImpl::QScriptValueImpl(bool val)
- : m_type(QScript::BooleanType), m_bool_value(val)
-{
-}
-
-inline QScriptValueImpl::QScriptValueImpl(int val)
- : m_type(QScript::NumberType), m_number_value(val)
-{
-}
-
-inline QScriptValueImpl::QScriptValueImpl(uint val)
- : m_type(QScript::NumberType), m_number_value(val)
-{
-}
-
-inline QScriptValueImpl::QScriptValueImpl(qsreal val)
- : m_type(QScript::NumberType), m_number_value(val)
-{
-}
-
-inline QScriptValueImpl::QScriptValueImpl(QScriptEnginePrivate *engine, const QString &val)
-{
- engine->newString(this, val);
-}
-
-inline QScriptValueImpl::QScriptValueImpl(QScriptNameIdImpl *val)
- : m_type(QScript::StringType), m_string_value(val)
-{
-}
-
-inline QScript::Type QScriptValueImpl::type() const
-{
- return m_type;
-}
-
-inline QScriptEnginePrivate *QScriptValueImpl::engine() const
-{
- if (!isObject())
- return 0;
- return m_object_value->m_class->engine();
-}
-
-inline QScriptClassInfo *QScriptValueImpl::classInfo() const
-{
- if (!isObject())
- return 0;
- return m_object_value->m_class;
-}
-
-inline void QScriptValueImpl::setClassInfo(QScriptClassInfo *cls)
-{
- Q_ASSERT(isObject());
- m_object_value->m_class = cls;
-}
-
-inline QScriptNameIdImpl *QScriptValueImpl::stringValue() const
-{
- Q_ASSERT(isString());
- return m_string_value;
-}
-
-inline QScriptObject *QScriptValueImpl::objectValue() const
-{
- Q_ASSERT(isObject());
- return m_object_value;
-}
-
-inline void QScriptValueImpl::incr()
-{
- ++m_number_value;
-}
-
-inline void QScriptValueImpl::decr()
-{
- --m_number_value;
-}
-
-inline void QScriptValueImpl::invalidate()
-{
- m_type = QScript::InvalidType;
-}
-
-inline bool QScriptValueImpl::isValid() const
-{
- return m_type != QScript::InvalidType;
-}
-
-inline bool QScriptValueImpl::isUndefined() const
-{
- return (m_type == QScript::UndefinedType);
-}
-
-inline bool QScriptValueImpl::isNull() const
-{
- return (m_type == QScript::NullType);
-}
-
-inline bool QScriptValueImpl::isBoolean() const
-{
- return (m_type == QScript::BooleanType);
-}
-
-inline bool QScriptValueImpl::isNumber() const
-{
- return (m_type == QScript::NumberType);
-}
-
-inline bool QScriptValueImpl::isString() const
-{
- return (m_type == QScript::StringType)
- || (m_type == QScript::LazyStringType);
-}
-
-inline bool QScriptValueImpl::isReference() const
-{
- return (m_type == QScript::ReferenceType);
-}
-
-inline bool QScriptValueImpl::isObject() const
-{
- return (m_type == QScript::ObjectType);
-}
-
-inline bool QScriptValueImpl::isFunction() const
-{
- return (m_type == QScript::ObjectType)
- && (classInfo()->type() & QScriptClassInfo::FunctionBased);
-}
-
-inline bool QScriptValueImpl::isVariant() const
-{
- return (m_type == QScript::ObjectType)
- && (classInfo()->type() == QScriptClassInfo::VariantType);
-}
-
-inline bool QScriptValueImpl::isQObject() const
-{
- return (m_type == QScript::ObjectType)
- && (classInfo()->type() == QScriptClassInfo::QObjectType);
-}
-
-inline bool QScriptValueImpl::isQMetaObject() const
-{
- return (m_type == QScript::ObjectType)
- && (classInfo()->type() == QScriptClassInfo::QMetaObjectType);
-}
-
-inline bool QScriptValueImpl::isArray() const
-{
- if (!isObject())
- return false;
- return classInfo() == engine()->arrayConstructor->classInfo();
-}
-
-inline bool QScriptValueImpl::isDate() const
-{
- if (!isObject())
- return false;
- return classInfo() == engine()->dateConstructor->classInfo();
-}
-
-inline bool QScriptValueImpl::isError() const
-{
- if (!isObject())
- return false;
- return classInfo() == engine()->errorConstructor->classInfo();
-}
-
-inline bool QScriptValueImpl::isRegExp() const
-{
- if (!isObject())
- return false;
- return classInfo() == engine()->regexpConstructor->classInfo();
-}
-
-inline qsreal QScriptValueImpl::toNumber() const
-{
- if (!isValid())
- return 0;
- return QScriptEnginePrivate::convertToNativeDouble(*this);
-}
-
-inline bool QScriptValueImpl::toBoolean() const
-{
- if (!isValid())
- return false;
- return QScriptEnginePrivate::convertToNativeBoolean(*this);
-}
-
-inline QString QScriptValueImpl::toString() const
-{
- if (!isValid())
- return QString();
- return QScriptEnginePrivate::convertToNativeString(*this);
-}
-
-inline qint32 QScriptValueImpl::toInt32() const
-{
- if (!isValid())
- return 0;
- double d = QScriptEnginePrivate::convertToNativeDouble(*this);
- return QScriptEnginePrivate::toInt32(d);
-}
-
-inline quint32 QScriptValueImpl::toUInt32() const
-{
- if (!isValid())
- return 0;
- double d = QScriptEnginePrivate::convertToNativeDouble(*this);
- return QScriptEnginePrivate::toUint32(d);
-}
-
-inline quint16 QScriptValueImpl::toUInt16() const
-{
- if (!isValid())
- return 0;
- double d = QScriptEnginePrivate::convertToNativeDouble(*this);
- return QScriptEnginePrivate::toUint16(d);
-}
-
-inline qsreal QScriptValueImpl::toInteger() const
-{
- if (!isValid())
- return 0;
- double d = QScriptEnginePrivate::convertToNativeDouble(*this);
- return QScriptEnginePrivate::toInteger(d);
-}
-
-inline QDateTime QScriptValueImpl::toDateTime() const
-{
- if (!isDate())
- return QDateTime();
- return engine()->toDateTime(*this);
-}
-
-#ifndef QT_NO_REGEXP
-inline QRegExp QScriptValueImpl::toRegExp() const
-{
- if (!isRegExp())
- return QRegExp();
- return engine()->regexpConstructor->toRegExp(*this);
-}
-#endif // QT_NO_REGEXP
-
-inline QObject *QScriptValueImpl::toQObject() const
-{
-#ifndef QT_NO_QOBJECT
- if (isQObject()) {
- QScript::ExtQObject *ctor = engine()->qobjectConstructor;
- Q_ASSERT(ctor != 0);
-
- QScript::ExtQObject::Instance *data = ctor->get(*this);
- Q_ASSERT(data != 0);
-
- return data->value;
- } else if (isVariant()) {
- int type = variantValue().userType();
- if ((type == QMetaType::QObjectStar) || (type == QMetaType::QWidgetStar))
- return *reinterpret_cast<QObject* const *>(variantValue().constData());
- }
-#endif
- return 0;
-}
-
-inline const QMetaObject *QScriptValueImpl::toQMetaObject() const
-{
-#ifndef QT_NO_QOBJECT
- if (isQMetaObject()) {
- QScript::ExtQMetaObject *ctor = engine()->qmetaObjectConstructor;
- Q_ASSERT(ctor != 0);
-
- QScript::ExtQMetaObject::Instance *data = ctor->get(*this);
- Q_ASSERT(data != 0);
-
- return data->value;
- }
-#endif
- return 0;
-}
-
-inline QScriptValueImpl QScriptValueImpl::prototype() const
-{
- if (!isObject())
- return QScriptValueImpl();
- return m_object_value->m_prototype;
-}
-
-inline void QScriptValueImpl::setPrototype(const QScriptValueImpl &prototype)
-{
- if (isObject())
- m_object_value->m_prototype = prototype;
-}
-
-inline QScriptObjectData *QScriptValueImpl::objectData() const
-{
- Q_ASSERT(isObject());
- return m_object_value->m_data;
-}
-
-inline void QScriptValueImpl::setObjectData(QScriptObjectData *data)
-{
- Q_ASSERT(isObject());
- m_object_value->m_data = data;
-}
-
-inline bool QScriptValueImpl::resolve(QScriptNameIdImpl *nameId, QScript::Member *member,
- QScriptValueImpl *object, QScriptValue::ResolveFlags mode,
- QScript::AccessMode access) const
-{
- Q_ASSERT(isValid());
- Q_ASSERT(isObject());
- Q_ASSERT(member);
- Q_ASSERT(object);
-
- Q_ASSERT(nameId->unique);
-
- QScriptObject *object_data = m_object_value;
-
- // Search in properties...
- if (object_data->findMember(nameId, member)) {
- *object = *this;
- return true;
- }
-
- return resolve_helper(nameId, member, object, mode, access);
-}
-
-inline void QScriptValueImpl::get(const QScript::Member &member, QScriptValueImpl *out) const
-{
- Q_ASSERT(out);
- Q_ASSERT(isObject());
- Q_ASSERT(member.isValid());
-
- if (! member.isObjectProperty()) {
- get_helper(member, out);
- return;
- }
-
- Q_ASSERT(member.id() >= 0);
- Q_ASSERT(member.id() < m_object_value->memberCount());
-
- m_object_value->get(member, out);
-}
-
-inline void QScriptValueImpl::get(QScriptNameIdImpl *nameId, QScriptValueImpl *out)
-{
- QScript::Member m;
- QScriptValueImpl o;
- if (resolve(nameId, &m, &o, QScriptValue::ResolvePrototype, QScript::Read))
- o.get(m, out);
- else
- *out = QScriptValueImpl(QScriptValue::UndefinedValue);
-}
-
-inline void QScriptValueImpl::get_helper(const QScript::Member &member, QScriptValueImpl *out) const
-{
- if (member.nameId() == engine()->idTable()->id___proto__) {
- *out = prototype();
-
- if (!out->isValid())
- *out = QScriptValueImpl(QScriptValue::UndefinedValue);
-
- return;
- }
-
- if (QScriptClassData *data = classInfo()->data()) {
- if (data->get(*this, member, out))
- return;
- }
-
- out->invalidate();
-}
-
-inline void QScriptValueImpl::put(const QScript::Member &member, const QScriptValueImpl &value)
-{
- Q_ASSERT(isObject());
- Q_ASSERT(member.isValid());
- // Q_ASSERT(member.isWritable());
-
- QScriptEnginePrivate *eng_p = engine();
-
- if (member.isObjectProperty()) {
- Q_ASSERT(member.nameId()->unique);
- Q_ASSERT(member.id() >= 0);
- Q_ASSERT(member.id() < m_object_value->memberCount());
- m_object_value->put(member, value);
- }
-
- else if (member.nameId() == eng_p->idTable()->id___proto__) {
- if (value.isNull()) // only Object.prototype.__proto__ can be null
- setPrototype(eng_p->undefinedValue());
- else {
- QScriptValueImpl was = prototype();
- setPrototype(value);
- if (detectedCycle()) {
- eng_p->currentContext()->throwError(QLatin1String("cycle in prototype chain"));
- setPrototype(was);
- }
- }
- }
-
- else {
- Q_ASSERT(classInfo()->data());
- classInfo()->data()->put(this, member, value);
- }
-}
-
-inline void QScriptValueImpl::setQObjectValue(QObject *object)
-{
-#ifndef QT_NO_QOBJECT
- Q_ASSERT(isQObject());
-
- QScript::ExtQObject *ctor = engine()->qobjectConstructor;
- Q_ASSERT(ctor != 0);
-
- QScript::ExtQObject::Instance *data = ctor->get(*this);
- Q_ASSERT(data != 0);
-
- data->value = object;
-#else
- Q_UNUSED(object);
-#endif
-}
-
-inline QVariant &QScriptValueImpl::variantValue() const
-{
- Q_ASSERT(isVariant());
-
- QScript::Ext::Variant *ctor = engine()->variantConstructor;
- Q_ASSERT(ctor != 0);
-
- QScript::Ext::Variant::Instance *data = ctor->get(*this);
- Q_ASSERT(data != 0);
-
- return data->value;
-}
-
-inline void QScriptValueImpl::setVariantValue(const QVariant &value)
-{
- if (!isVariant())
- return;
-
- QScript::Ext::Variant *ctor = engine()->variantConstructor;
- Q_ASSERT(ctor != 0);
-
- QScript::Ext::Variant::Instance *data = ctor->get(*this);
- Q_ASSERT(data != 0);
-
- data->value = value;
-}
-
-inline QScriptValueImpl QScriptValueImpl::internalValue() const
-{
- Q_ASSERT(isObject());
- return m_object_value->m_internalValue;
-}
-
-inline void QScriptValueImpl::setInternalValue(const QScriptValueImpl &internalValue)
-{
- Q_ASSERT(isObject());
- m_object_value->m_internalValue = internalValue;
-}
-
-inline void QScriptValueImpl::removeMember(const QScript::Member &member)
-{
- if (member.isObjectProperty())
- m_object_value->removeMember(member);
-
- else if (QScriptClassData *data = classInfo()->data())
- data->removeMember(*this, member);
-}
-
-inline void QScriptValueImpl::createMember(QScriptNameIdImpl *nameId,
- QScript::Member *member, uint flags)
-{
- Q_ASSERT(isObject());
-
- QScriptObject *object_data = m_object_value;
- object_data->createMember(nameId, member, flags);
- Q_ASSERT(member->isObjectProperty());
-}
-
-inline QScriptValueImpl QScriptValueImpl::scope() const
-{
- Q_ASSERT(isObject());
- return m_object_value->m_scope;
-}
-
-inline void QScriptValueImpl::setScope(const QScriptValueImpl &scope)
-{
- Q_ASSERT(isObject());
- m_object_value->m_scope = scope;
-}
-
-inline int QScriptValueImpl::memberCount() const
-{
- Q_ASSERT(isObject());
- return m_object_value->memberCount();
-}
-
-inline void QScriptValueImpl::member(int index, QScript::Member *member) const
-{
- Q_ASSERT(isObject());
- Q_ASSERT(index >= 0);
- Q_ASSERT(index < m_object_value->memberCount());
- m_object_value->member(index, member);
-}
-
-inline QScriptFunction *QScriptValueImpl::toFunction() const
-{
- if (!isFunction())
- return 0;
- return engine()->convertToNativeFunction(*this);
-}
-
-inline QScriptValueImpl QScriptValueImpl::property(QScriptNameIdImpl *nameId,
- const QScriptValue::ResolveFlags &mode) const
-{
- if (!isObject())
- return QScriptValueImpl();
-
- QScriptValueImpl base;
- QScript::Member member;
-
- if (! resolve(nameId, &member, &base, mode, QScript::Read))
- return QScriptValueImpl();
-
- QScriptValueImpl value;
- base.get(member, &value);
- if (member.isGetterOrSetter()) {
- QScriptValueImpl getter;
- if (member.isObjectProperty() && !member.isGetter()) {
- if (!base.m_object_value->findGetter(&member))
- return QScriptValueImpl();
- }
- base.get(member, &getter);
- value = getter.call(*this);
- }
- return value;
-}
-
-inline void QScriptValueImpl::setProperty(const QString &name, const QScriptValueImpl &value,
- const QScriptValue::PropertyFlags &flags)
-{
- if (!isObject())
- return;
- QScriptNameIdImpl *nameId = engine()->nameId(name);
- setProperty(nameId, value, flags);
-}
-
-inline QScriptValueImpl QScriptValueImpl::property(const QString &name,
- const QScriptValue::ResolveFlags &mode) const
-{
- if (!isObject())
- return QScriptValueImpl();
- QScriptNameIdImpl *nameId = engine()->nameId(name);
- return property(nameId, mode);
-}
-
-inline QScriptValueImpl QScriptValueImpl::property(quint32 arrayIndex,
- const QScriptValue::ResolveFlags &mode) const
-{
- if (!isObject())
- return QScriptValueImpl();
-
- QScriptEnginePrivate *eng_p = engine();
- QScript::Ecma::Array::Instance *instance = eng_p->arrayConstructor->get(*this);
- if (instance && (arrayIndex != 0xFFFFFFFF))
- return instance->value.at(arrayIndex);
-
- return property(QScriptValueImpl(arrayIndex).toString(), mode);
-}
-
-inline void QScriptValueImpl::setProperty(quint32 arrayIndex, const QScriptValueImpl &value,
- const QScriptValue::PropertyFlags &flags)
-{
- if (!isObject())
- return;
-
- QScriptEnginePrivate *eng_p = engine();
- QScript::Ecma::Array::Instance *instance = eng_p->arrayConstructor->get(*this);
- if (instance && (arrayIndex != 0xFFFFFFFF)) {
- instance->value.assign(arrayIndex, value);
- return;
- }
-
- setProperty(QScriptValueImpl(arrayIndex).toString(), value, flags);
-}
-
-inline QScriptValue::PropertyFlags QScriptValueImpl::propertyFlags(const QString &name,
- const QScriptValue::ResolveFlags &mode) const
-{
- QScriptNameIdImpl *nameId = engine()->nameId(name);
- return propertyFlags(nameId, mode);
-}
-
-inline QScriptValue::PropertyFlags QScriptValueImpl::propertyFlags(QScriptNameIdImpl *nameId,
- const QScriptValue::ResolveFlags &mode) const
-{
- if (!isObject())
- return 0;
-
- QScriptValueImpl base;
- QScript::Member member;
- if (! resolve(nameId, &member, &base, mode, QScript::ReadWrite))
- return 0;
-
- return QScriptValue::PropertyFlags(member.flags() & ~QScript::Member::InternalRange);
-}
-
-inline bool QScriptValueImpl::deleteProperty(QScriptNameIdImpl *nameId,
- const QScriptValue::ResolveFlags &mode)
-{
- if (!isObject())
- return true;
- QScript::Member member;
- QScriptValueImpl base;
- if (resolve(nameId, &member, &base, mode, QScript::Write)) {
- if (!member.isDeletable())
- return false;
- base.removeMember(member);
- if (member.isGetterOrSetter() && (member.isGetter() != member.isSetter())) {
- // delete the "other half" of the property too (getter or setter)
- return deleteProperty(nameId, mode);
- }
- }
- return true;
-}
-
-inline QScriptValueImpl QScriptValueImpl::call(const QScriptValueImpl &thisObject,
- const QScriptValueImplList &args)
-{
- if (!isFunction())
- return QScriptValueImpl();
-
- return engine()->call(*this, thisObject, args, /*asConstructor=*/false);
-}
-
-inline QScriptValueImpl QScriptValueImpl::call(const QScriptValueImpl &thisObject,
- const QScriptValueImpl &args)
-{
- if (!isFunction())
- return QScriptValueImpl();
-
- return engine()->call(*this, thisObject, args, /*asConstructor=*/false);
-}
-
-inline QScriptValueImpl QScriptValueImpl::construct(const QScriptValueImplList &args)
-{
- if (!isFunction())
- return QScriptValueImpl();
-
- QScriptEnginePrivate *eng_p = engine();
-
- QScriptValueImpl proto = property(QLatin1String("prototype"), QScriptValue::ResolveLocal);
- QScriptValueImpl object;
- eng_p->newObject(&object, proto);
-
- QScriptValueImpl result = eng_p->call(*this, object, args, /*asConstructor=*/true);
- if (result.isObject())
- return result;
- return object;
-}
-
-inline QScriptValueImpl QScriptValueImpl::construct(const QScriptValueImpl &args)
-{
- if (!isFunction())
- return QScriptValueImpl();
-
- QScriptEnginePrivate *eng_p = engine();
-
- QScriptValueImpl proto = property(QLatin1String("prototype"), QScriptValue::ResolveLocal);
- QScriptValueImpl object;
- eng_p->newObject(&object, proto);
-
- QScriptValueImpl result = eng_p->call(*this, object, args, /*asConstructor=*/true);
- if (result.isObject())
- return result;
- return object;
-}
-
-inline void QScriptValueImpl::mark(int generation) const
-{
- if (! isValid())
- return;
-
- else if (isString())
- engine()->markString(m_string_value, generation);
-
- else if (isObject())
- engine()->markObject(*this, generation);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/qscriptvalueimplfwd_p.h b/src/script/qscriptvalueimplfwd_p.h
deleted file mode 100644
index aa0c86f..0000000
--- a/src/script/qscriptvalueimplfwd_p.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTVALUEIMPLFWD_P_H
-#define QSCRIPTVALUEIMPLFWD_P_H
-
-#include "qscriptglobals_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptvalue.h"
-
-#include <QtCore/qstring.h>
-#include <QtCore/qlist.h>
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptValueImpl;
-typedef QList<QScriptValueImpl> QScriptValueImplList;
-
-class QScriptClassInfo;
-class QScriptObject;
-class QScriptObjectData;
-class QScriptNameIdImpl;
-class QScriptFunction;
-class QScriptEnginePrivate;
-
-namespace QScript
-{
- class Member;
-}
-
-class QScriptValueImpl
-{
-public:
- enum TypeHint {
- NoTypeHint,
- NumberTypeHint,
- StringTypeHint
- };
-
- inline QScriptValueImpl();
- inline QScriptValueImpl(QScriptValue::SpecialValue val);
- inline QScriptValueImpl(bool val);
- inline QScriptValueImpl(int val);
- inline QScriptValueImpl(uint val);
- inline QScriptValueImpl(qsreal val);
- inline QScriptValueImpl(QScriptEnginePrivate *engine, const QString &val);
- inline QScriptValueImpl(QScriptNameIdImpl *val);
-
- inline QScript::Type type() const;
- inline QScriptEnginePrivate *engine() const;
- inline QScriptClassInfo *classInfo() const;
- inline void setClassInfo(QScriptClassInfo *cls);
- inline QScriptNameIdImpl *stringValue() const;
- inline QScriptObject *objectValue() const;
- inline void incr();
- inline void decr();
-
- inline void invalidate();
- inline bool isValid() const;
- inline bool isBoolean() const;
- inline bool isNumber() const;
- inline bool isString() const;
- inline bool isFunction() const;
- inline bool isObject() const;
- inline bool isUndefined() const;
- inline bool isNull() const;
- inline bool isVariant() const;
- inline bool isQObject() const;
- inline bool isQMetaObject() const;
- inline bool isReference() const;
-
- inline bool isError() const;
- inline bool isArray() const;
- inline bool isDate() const;
- inline bool isRegExp() const;
-
- inline QString toString() const;
- inline qsreal toNumber() const;
- inline bool toBoolean() const;
- inline qsreal toInteger() const;
- inline qint32 toInt32() const;
- inline quint32 toUInt32() const;
- inline quint16 toUInt16() const;
- QVariant toVariant() const;
- inline QObject *toQObject() const;
- inline const QMetaObject *toQMetaObject() const;
- inline QDateTime toDateTime() const;
-#ifndef QT_NO_REGEXP
- inline QRegExp toRegExp() const;
-#endif
-
- inline QVariant &variantValue() const;
- inline void setVariantValue(const QVariant &v);
-
- bool instanceOf(const QScriptValueImpl &value) const;
- bool instanceOf_helper(const QScriptValueImpl &value) const;
-
- bool implementsHasInstance() const;
- bool hasInstance(const QScriptValueImpl &value) const;
-
- inline QScriptValueImpl prototype() const;
- inline void setPrototype(const QScriptValueImpl &prototype);
-
- inline QScriptValueImpl property(QScriptNameIdImpl *nameId,
- const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const;
- void setProperty(QScriptNameIdImpl *nameId, const QScriptValueImpl &value,
- const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
-
- inline QScriptValueImpl property(const QString &name,
- const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const;
- inline void setProperty(const QString &name, const QScriptValueImpl &value,
- const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
-
- inline QScriptValueImpl property(quint32 arrayIndex,
- const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const;
- inline void setProperty(quint32 arrayIndex, const QScriptValueImpl &value,
- const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
-
- inline QScriptValue::PropertyFlags propertyFlags(const QString &name,
- const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const;
- inline QScriptValue::PropertyFlags propertyFlags(QScriptNameIdImpl *nameId,
- const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const;
-
- inline bool deleteProperty(QScriptNameIdImpl *nameId,
- const QScriptValue::ResolveFlags &mode = QScriptValue::ResolveLocal);
-
- inline QScriptValueImpl call(const QScriptValueImpl &thisObject = QScriptValueImpl(),
- const QScriptValueImplList &args = QScriptValueImplList());
- inline QScriptValueImpl call(const QScriptValueImpl &thisObject,
- const QScriptValueImpl &arguments);
- inline QScriptValueImpl construct(const QScriptValueImplList &args = QScriptValueImplList());
- inline QScriptValueImpl construct(const QScriptValueImpl &arguments);
-
- inline void mark(int) const;
- bool isMarked(int) const;
-
- inline QScriptValueImpl internalValue() const;
- inline void setInternalValue(const QScriptValueImpl &internalValue);
-
- inline void setQObjectValue(QObject *object);
-
- inline QScriptObjectData *objectData() const;
- inline void setObjectData(QScriptObjectData *data);
- void destroyObjectData();
-
- inline void createMember(QScriptNameIdImpl *nameId,
- QScript::Member *member, uint flags); // ### remove me
- inline int memberCount() const;
- inline void member(int index, QScript::Member *member) const;
-
- inline bool resolve(QScriptNameIdImpl *nameId, QScript::Member *member,
- QScriptValueImpl *object, QScriptValue::ResolveFlags mode,
- QScript::AccessMode access) const;
- bool resolve_helper(QScriptNameIdImpl *nameId, QScript::Member *member,
- QScriptValueImpl *object, QScriptValue::ResolveFlags mode,
- QScript::AccessMode access) const;
- inline void get(const QScript::Member &member, QScriptValueImpl *out) const;
- inline void get_helper(const QScript::Member &member, QScriptValueImpl *out) const;
- inline void get(QScriptNameIdImpl *nameId, QScriptValueImpl *out);
- inline void put(const QScript::Member &member, const QScriptValueImpl &value);
- inline void removeMember(const QScript::Member &member);
-
- inline QScriptValueImpl scope() const;
- inline void setScope(const QScriptValueImpl &scope);
-
- inline QScriptFunction *toFunction() const;
-
- bool detectedCycle() const;
-
- QScript::Type m_type;
- union {
- bool m_bool_value;
- int m_int_value;
- qsreal m_number_value;
- void *m_ptr_value;
- QScriptObject *m_object_value;
- QScriptNameIdImpl *m_string_value;
- QString *m_lazy_string_value;
- };
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif // QSCRIPTVALUEIMPLFWD_P_H
diff --git a/src/script/qscriptvalueiterator.h b/src/script/qscriptvalueiterator.h
deleted file mode 100644
index 91561e8..0000000
--- a/src/script/qscriptvalueiterator.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTVALUEITERATOR_H
-#define QSCRIPTVALUEITERATOR_H
-
-#include <QtScript/qscriptvalue.h>
-
-#ifndef QT_NO_SCRIPT
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Script)
-
-class QString;
-class QScriptString;
-
-class QScriptValueIteratorPrivate;
-class Q_SCRIPT_EXPORT QScriptValueIterator
-{
-public:
- QScriptValueIterator(const QScriptValue &value);
- ~QScriptValueIterator();
-
- bool hasNext() const;
- void next();
-
- bool hasPrevious() const;
- void previous();
-
- QString name() const;
- QScriptString scriptName() const;
-
- QScriptValue value() const;
- void setValue(const QScriptValue &value);
-
- QScriptValue::PropertyFlags flags() const;
-
- void remove();
-
- void toFront();
- void toBack();
-
- QScriptValueIterator& operator=(QScriptValue &value);
-
-private:
- QScriptValueIteratorPrivate *d_ptr;
-
- Q_DECLARE_PRIVATE(QScriptValueIterator)
- Q_DISABLE_COPY(QScriptValueIterator)
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QT_NO_SCRIPT
-
-#endif // QSCRIPTVALUEITERATOR_H
diff --git a/src/script/qscriptvalueiterator_p.h b/src/script/qscriptvalueiterator_p.h
deleted file mode 100644
index e1f2815..0000000
--- a/src/script/qscriptvalueiterator_p.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTVALUEITERATOR_P_H
-#define QSCRIPTVALUEITERATOR_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-QT_BEGIN_NAMESPACE
-
-class QScriptValueIteratorImpl;
-
-class QScriptValueIterator;
-class QScriptValueIteratorPrivate
-{
- Q_DECLARE_PUBLIC(QScriptValueIterator)
-public:
- QScriptValueIteratorPrivate();
- ~QScriptValueIteratorPrivate();
-
- QScriptValueIterator *q_ptr;
-
- QScriptValueIteratorImpl *it;
-};
-
-QT_END_NAMESPACE
-
-#endif // QSCRIPTVALUEITERATOR_P_H
diff --git a/src/script/qscriptvalueiteratorimpl.cpp b/src/script/qscriptvalueiteratorimpl.cpp
deleted file mode 100644
index bfe3946..0000000
--- a/src/script/qscriptvalueiteratorimpl.cpp
+++ /dev/null
@@ -1,415 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscriptvalueiteratorimpl_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptengine_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QScript {
-
-extern QString numberToString(qsreal value);
-
-} // namespace
-
-QScriptValueIteratorImpl::QScriptValueIteratorImpl(const QScriptValueImpl &obj)
-{
- Q_ASSERT(obj.isObject());
- m_frontObject = obj;
- m_member.invalidate();
- m_foundMember.invalidate();
- m_foundForward = false;
- m_object = obj;
- m_searchIndex = 0;
- m_searchClassDataIterator = false;
- m_classDataIterator = 0;
- m_ignoresDontEnum = true;
- m_enumerateProto = false;
-}
-
-QScriptValueIteratorImpl::~QScriptValueIteratorImpl()
-{
- if (m_classDataIterator) {
- delete m_classDataIterator;
- m_classDataIterator = 0;
- }
-}
-
-bool QScriptValueIteratorImpl::ignoresDontEnum() const
-{
- return m_ignoresDontEnum;
-}
-
-void QScriptValueIteratorImpl::setIgnoresDontEnum(bool ignore)
-{
- m_ignoresDontEnum = ignore;
-}
-
-bool QScriptValueIteratorImpl::enumeratePrototype() const
-{
- return m_enumerateProto;
-}
-
-void QScriptValueIteratorImpl::setEnumeratePrototype(bool enable)
-{
- m_enumerateProto = enable;
-}
-
-bool QScriptValueIteratorImpl::acceptsMember(const QScriptValueImpl &o,
- const QScript::Member &m) const
-{
- if (!m.isValid() || (!m_ignoresDontEnum && m.dontEnum())
- || (m.isSetter() && !m.isGetter())) {
- return false;
- }
-
- if (!m_enumerateProto || QScriptEnginePrivate::strictlyEquals(o, m_frontObject))
- return true;
-
- // make sure it's not a shadowed property
- QScript::Member dummy;
- QScriptValueImpl base;
- QScriptNameIdImpl *id;
- if (m.nameId()) {
- id = m.nameId();
- } else {
- QScriptEnginePrivate *eng_p = m_frontObject.engine();
- id = eng_p->nameId(QScript::numberToString(m.id()));
- }
- m_frontObject.resolve(id, &dummy, &base, QScriptValue::ResolvePrototype, QScript::Read);
- return QScriptEnginePrivate::strictlyEquals(base, o);
-}
-
-bool QScriptValueIteratorImpl::hasNext()
-{
- if (m_foundMember.isValid() && m_foundForward) {
- // we have the information about the next element already
- return true;
- }
-
- int idx, count;
- QScriptValueImpl obj = m_object;
-
- if (m_searchClassDataIterator) {
- Q_ASSERT(m_classDataIterator != 0);
- if (m_foundMember.isValid()) {
- // undo effect of hasPrevious()
- m_foundMember.invalidate();
- QScript::Member dummy;
- m_classDataIterator->next(&dummy);
- }
- goto LSearchClassData;
- }
-
- idx = m_searchIndex;
- if (m_foundMember.isValid()) {
- // undo effect of hasPrevious()
- m_foundMember.invalidate();
- ++idx;
- }
-
- LSearchObjectData:
- count = obj.memberCount();
- for (int i = idx; i < count; ++i) {
- QScript::Member m;
- obj.member(i, &m);
- if (acceptsMember(obj, m)) {
- m_foundObject = obj;
- m_foundMember = m;
- m_foundForward = true;
- m_searchIndex = i + 1;
- return true;
- }
- }
-
- if (!m_classDataIterator) {
- QScriptClassData *data = obj.classInfo()->data();
- if (!data)
- goto LNext;
- m_classDataIterator = data->newIterator(obj);
- if (!m_classDataIterator)
- goto LNext;
- }
- m_searchClassDataIterator = true;
-
- LSearchClassData:
- Q_ASSERT(m_classDataIterator != 0);
- while (m_classDataIterator->hasNext()) {
- QScript::Member m;
- m_classDataIterator->next(&m);
- if (acceptsMember(obj, m)) {
- m_foundObject = obj;
- m_foundMember = m;
- m_foundForward = true;
- return true;
- }
- }
-
- LNext:
- if (!m_enumerateProto || !obj.prototype().isObject())
- return false;
-
- // look in prototype
- obj = obj.prototype();
- idx = 0;
- if (m_classDataIterator) {
- delete m_classDataIterator;
- m_classDataIterator = 0;
- m_searchClassDataIterator = false;
- }
- goto LSearchObjectData;
-}
-
-void QScriptValueIteratorImpl::next()
-{
- (void)hasNext(); // sync the next-element info
- m_object = m_foundObject;
- m_member = m_foundMember;
- m_foundObject = QScriptValueImpl();
- m_foundMember.invalidate();
-}
-
-bool QScriptValueIteratorImpl::hasPrevious()
-{
- if (m_foundMember.isValid() && !m_foundForward) {
- // we have the information about the previous element already
- return true;
- }
-
- QScriptValueImpl obj = m_object;
-
- if (m_searchClassDataIterator) {
- Q_ASSERT(m_classDataIterator != 0);
- if (m_foundMember.isValid()) {
- // undo effect of hasNext()
- m_foundMember.invalidate();
- QScript::Member dummy;
- m_classDataIterator->previous(&dummy);
- }
- while (m_classDataIterator->hasPrevious()) {
- QScript::Member m;
- m_classDataIterator->previous(&m);
- if (acceptsMember(obj, m)) {
- m_foundObject = obj;
- m_foundMember = m;
- m_foundForward = false;
- return true;
- }
- }
- m_searchClassDataIterator = false;
- m_searchIndex = obj.memberCount();
- m_foundMember.invalidate();
- }
-
- // search object members
- int i = m_searchIndex - 1;
- if (m_foundMember.isValid()) {
- // undo effect of hasPrevious()
- m_foundMember.invalidate();
- --i;
- }
- for ( ; i >= 0; --i) {
- QScript::Member m;
- obj.member(i, &m);
- if (acceptsMember(obj, m)) {
- m_foundObject = obj;
- m_foundMember = m;
- m_foundForward = false;
- m_searchIndex = i;
- return true;
- }
- }
-
- return false;
-}
-
-void QScriptValueIteratorImpl::previous()
-{
- (void)hasPrevious(); // sync the previous-element info
- m_object = m_foundObject;
- m_member = m_foundMember;
- m_foundObject = QScriptValueImpl();
- m_foundMember.invalidate();
-}
-
-QScript::Member *QScriptValueIteratorImpl::member()
-{
- return &m_member;
-}
-
-QScriptNameIdImpl *QScriptValueIteratorImpl::nameId() const
-{
- return m_member.nameId();
-}
-
-QString QScriptValueIteratorImpl::name() const
-{
- if (!m_member.isValid())
- return QString();
- if (m_member.nameId())
- return m_member.nameId()->s;
- else
- return QScript::numberToString(m_member.id());
-}
-
-QScriptValueImpl QScriptValueIteratorImpl::value() const
-{
- if (!m_member.isValid())
- return QScriptValueImpl();
- QScriptValueImpl result;
- m_object.get(m_member, &result);
- if (m_member.isGetterOrSetter()) {
- // find and call the getter
- QScriptValueImpl getter;
- if (m_member.isObjectProperty() && !m_member.isGetter()) {
- QScript::Member mb;
- QScriptObject *obj = m_object.m_object_value;
- mb.object(m_member.nameId(), obj->memberCount(), 0);
- if (!obj->findGetter(&mb))
- return QScriptValueImpl();
- m_object.get(mb, &getter);
- } else {
- getter = result;
- }
- result = getter.call(m_object);
- }
- return result;
-}
-
-void QScriptValueIteratorImpl::setValue(const QScriptValueImpl &value)
-{
- if (!m_member.isValid())
- return;
- if (m_member.isGetterOrSetter()) {
- // find and call the setter
- QScriptValueImpl setter;
- if (m_member.isObjectProperty() && !m_member.isSetter()) {
- QScript::Member mb;
- QScriptObject *obj = m_object.m_object_value;
- mb.object(m_member.nameId(), obj->memberCount(), 0);
- if (!obj->findSetter(&mb))
- return;
- m_object.get(mb, &setter);
- } else {
- m_object.get(m_member, &setter);
- }
- setter.call(m_object, QScriptValueImplList() << value);
- } else {
- m_object.put(m_member, value);
- }
-}
-
-uint QScriptValueIteratorImpl::flags() const
-{
- return m_member.flags();
-}
-
-QScriptValueImpl QScriptValueIteratorImpl::object() const
-{
- return m_object;
-}
-
-void QScriptValueIteratorImpl::setObject(const QScriptValueImpl &obj)
-{
- Q_ASSERT(obj.isObject());
- m_object = obj;
- if (m_classDataIterator) {
- delete m_classDataIterator;
- m_classDataIterator = 0;
- }
- toFront();
-}
-
-void QScriptValueIteratorImpl::remove()
-{
- if (m_member.isValid())
- m_object.removeMember(m_member);
-}
-
-void QScriptValueIteratorImpl::toFront()
-{
- if (m_classDataIterator) {
- if (!m_enumerateProto || QScriptEnginePrivate::strictlyEquals(m_object, m_frontObject)) {
- m_classDataIterator->toFront();
- } else {
- delete m_classDataIterator;
- m_classDataIterator = 0;
- }
- }
-
- m_member.invalidate();
- m_object = m_frontObject;
-
- m_foundObject = QScriptValueImpl();
- m_foundMember.invalidate();
- m_searchIndex = 0;
- m_searchClassDataIterator = false;
-}
-
-void QScriptValueIteratorImpl::toBack()
-{
- m_member.invalidate();
-
- m_foundObject = QScriptValueImpl();
- m_foundMember.invalidate();
-
- if (!m_classDataIterator) {
- QScriptClassData *data = m_object.classInfo()->data();
- if (data)
- m_classDataIterator = data->newIterator(m_object);
- }
- if (m_classDataIterator)
- m_classDataIterator->toBack();
- else
- m_searchIndex = m_object.memberCount();
- m_searchClassDataIterator = (m_classDataIterator != 0);
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
diff --git a/src/script/qscriptvalueiteratorimpl_p.h b/src/script/qscriptvalueiteratorimpl_p.h
deleted file mode 100644
index 4ee7b11..0000000
--- a/src/script/qscriptvalueiteratorimpl_p.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Qt Software Information (qt-info@nokia.com)
-**
-** This file is part of the QtScript module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSCRIPTVALUEITERATORIMPL_P_H
-#define QSCRIPTVALUEITERATORIMPL_P_H
-
-#include "qscriptvalueimplfwd_p.h"
-
-#ifndef QT_NO_SCRIPT
-
-#include "qscriptmemberfwd_p.h"
-
-QT_BEGIN_NAMESPACE
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-class QScriptClassDataIterator;
-class QScriptNameIdImpl;
-
-class QScriptValueIteratorImpl
-{
-public:
- QScriptValueIteratorImpl(const QScriptValueImpl &obj);
- ~QScriptValueIteratorImpl();
-
- bool ignoresDontEnum() const;
- void setIgnoresDontEnum(bool ignore);
-
- bool enumeratePrototype() const;
- void setEnumeratePrototype(bool enable);
-
- bool hasNext();
- void next();
-
- bool hasPrevious();
- void previous();
-
- QScript::Member *member();
-
- QScriptNameIdImpl *nameId() const;
- QString name() const;
-
- QScriptValueImpl value() const;
- void setValue(const QScriptValueImpl &value);
-
- uint flags() const;
-
- void remove();
-
- void toFront();
- void toBack();
-
- QScriptValueImpl object() const;
- void setObject(const QScriptValueImpl &obj);
-
-private:
- bool acceptsMember(const QScriptValueImpl &o, const QScript::Member &m) const;
- QScriptClassDataIterator *getClassDataIterator();
-
- QScriptValueImpl m_frontObject;
-
- bool m_ignoresDontEnum;
- bool m_enumerateProto;
-
- QScriptValueImpl m_object;
- QScript::Member m_member;
-
- int m_searchIndex;
- QScriptValueImpl m_foundObject;
- QScript::Member m_foundMember;
- bool m_foundForward;
- QScriptClassDataIterator *m_classDataIterator;
- bool m_searchClassDataIterator;
-};
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCRIPT
-
-#endif
diff --git a/src/script/script.pri b/src/script/script.pri
index 15e68de..b064185 100644
--- a/src/script/script.pri
+++ b/src/script/script.pri
@@ -1,124 +1,35 @@
+# FIXME: shared the statically built JavaScriptCore
+include($$PWD/../3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri)
-*-g++:DEFINES += Q_SCRIPT_DIRECT_CODE
+include($$PWD/api/api.pri)
+include($$PWD/bridge/bridge.pri)
+include($$PWD/parser/parser.pri)
+include($$PWD/visitors/visitors.pri)
+include($$PWD/utils/utils.pri)
-SOURCES += \
- $$PWD/qscriptasm.cpp \
- $$PWD/qscriptast.cpp \
- $$PWD/qscriptastvisitor.cpp \
- $$PWD/qscriptcompiler.cpp \
- $$PWD/qscriptecmaarray.cpp \
- $$PWD/qscriptecmaboolean.cpp \
- $$PWD/qscriptecmacore.cpp \
- $$PWD/qscriptecmadate.cpp \
- $$PWD/qscriptecmafunction.cpp \
- $$PWD/qscriptecmaglobal.cpp \
- $$PWD/qscriptecmamath.cpp \
- $$PWD/qscriptecmanumber.cpp \
- $$PWD/qscriptecmaobject.cpp \
- $$PWD/qscriptecmaregexp.cpp \
- $$PWD/qscriptecmastring.cpp \
- $$PWD/qscriptecmaerror.cpp \
- $$PWD/qscriptcontext_p.cpp \
- $$PWD/qscriptengine.cpp \
- $$PWD/qscriptengine_p.cpp \
- $$PWD/qscriptengineagent.cpp \
- $$PWD/qscriptextenumeration.cpp \
- $$PWD/qscriptextvariant.cpp \
- $$PWD/qscriptcontext.cpp \
- $$PWD/qscriptcontextinfo.cpp \
- $$PWD/qscriptfunction.cpp \
- $$PWD/qscriptgrammar.cpp \
- $$PWD/qscriptlexer.cpp \
- $$PWD/qscriptclassdata.cpp \
- $$PWD/qscriptparser.cpp \
- $$PWD/qscriptprettypretty.cpp \
- $$PWD/qscriptxmlgenerator.cpp \
- $$PWD/qscriptsyntaxchecker.cpp \
- $$PWD/qscriptstring.cpp \
- $$PWD/qscriptclass.cpp \
- $$PWD/qscriptclasspropertyiterator.cpp \
- $$PWD/qscriptvalueiteratorimpl.cpp \
- $$PWD/qscriptvalueiterator.cpp \
- $$PWD/qscriptvalueimpl.cpp \
- $$PWD/qscriptvalue.cpp
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/parser
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/bytecompiler
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/debugger
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/runtime
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/wtf
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/unicode
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/interpreter
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/jit
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/profiler
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/wrec
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/API
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/bytecode
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/assembler
+INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/generated
-HEADERS += \
- $$PWD/qscriptarray_p.h \
- $$PWD/qscriptasm_p.h \
- $$PWD/qscriptastfwd_p.h \
- $$PWD/qscriptast_p.h \
- $$PWD/qscriptastvisitor_p.h \
- $$PWD/qscriptbuffer_p.h \
- $$PWD/qscriptcompiler_p.h \
- $$PWD/qscriptcontext.h \
- $$PWD/qscriptcontextfwd_p.h \
- $$PWD/qscriptcontext_p.h \
- $$PWD/qscriptcontextinfo.h \
- $$PWD/qscriptcontextinfo_p.h \
- $$PWD/qscriptecmaarray_p.h \
- $$PWD/qscriptecmaboolean_p.h \
- $$PWD/qscriptecmacore_p.h \
- $$PWD/qscriptecmadate_p.h \
- $$PWD/qscriptecmafunction_p.h \
- $$PWD/qscriptecmaglobal_p.h \
- $$PWD/qscriptecmamath_p.h \
- $$PWD/qscriptecmanumber_p.h \
- $$PWD/qscriptecmaobject_p.h \
- $$PWD/qscriptecmaregexp_p.h \
- $$PWD/qscriptecmastring_p.h \
- $$PWD/qscriptecmaerror_p.h \
- $$PWD/qscriptengine.h \
- $$PWD/qscriptenginefwd_p.h \
- $$PWD/qscriptengine_p.h \
- $$PWD/qscriptengineagent.h \
- $$PWD/qscriptengineagent_p.h \
- $$PWD/qscriptable.h \
- $$PWD/qscriptable_p.h \
- $$PWD/qscriptextenumeration_p.h \
- $$PWD/qscriptextvariant_p.h \
- $$PWD/qscriptfunction_p.h \
- $$PWD/qscriptgc_p.h \
- $$PWD/qscriptglobals_p.h \
- $$PWD/qscriptgrammar_p.h \
- $$PWD/qscriptobjectdata_p.h \
- $$PWD/qscriptobjectfwd_p.h \
- $$PWD/qscriptobject_p.h \
- $$PWD/qscriptlexer_p.h \
- $$PWD/qscriptmemberfwd_p.h \
- $$PWD/qscriptmember_p.h \
- $$PWD/qscriptmemorypool_p.h \
- $$PWD/qscriptnodepool_p.h \
- $$PWD/qscriptclassinfo_p.h \
- $$PWD/qscriptparser_p.h \
- $$PWD/qscriptprettypretty_p.h \
- $$PWD/qscriptsyntaxcheckresult_p.h \
- $$PWD/qscriptxmlgenerator_p.h \
- $$PWD/qscriptrepository_p.h \
- $$PWD/qscriptsyntaxchecker_p.h \
- $$PWD/qscriptstring.h \
- $$PWD/qscriptstring_p.h \
- $$PWD/qscriptclass.h \
- $$PWD/qscriptclass_p.h \
- $$PWD/qscriptclasspropertyiterator.h \
- $$PWD/qscriptclasspropertyiterator_p.h \
- $$PWD/qscriptvalue.h \
- $$PWD/qscriptvaluefwd_p.h \
- $$PWD/qscriptvalue_p.h \
- $$PWD/qscriptvalueimplfwd_p.h \
- $$PWD/qscriptvalueimpl_p.h \
- $$PWD/qscriptvalueiteratorimpl_p.h \
- $$PWD/qscriptvalueiterator.h \
- $$PWD/qscriptvalueiterator_p.h \
- $$PWD/qscriptextensioninterface.h \
- $$PWD/qscriptextensionplugin.h \
- $$PWD/qscriptnameid_p.h \
- $$PWD/qscriptclassdata_p.h
+# FIXME: not needed once JSCBISON works
+# TODO: or leave it like this since the generated file is available anyway?
+SOURCES += $$PWD/../3rdparty/webkit/JavaScriptCore/generated/Grammar.cpp
+
+DEFINES += BUILDING_QT__=1
+DEFINES += USE_SYSTEM_MALLOC
+DEFINES += WTF_USE_JAVASCRIPTCORE_BINDINGS=1
+DEFINES += WTF_CHANGES=1
+DEFINES += NDEBUG
-!contains(DEFINES, QT_NO_QOBJECT) {
- HEADERS += $$PWD/qscriptextqobject_p.h
- SOURCES += $$PWD/qscriptextqobject.cpp \
- $$PWD/qscriptable.cpp \
- $$PWD/qscriptextensionplugin.cpp
-} else {
- INCLUDEPATH += $$PWD
-}
diff --git a/src/script/utils/qscriptdate.cpp b/src/script/utils/qscriptdate.cpp
new file mode 100644
index 0000000..43314c2
--- /dev/null
+++ b/src/script/utils/qscriptdate.cpp
@@ -0,0 +1,491 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#include "qscriptdate_p.h"
+
+#ifndef QT_NO_SCRIPT
+
+#include <QtCore/qnumeric.h>
+#include <QtCore/qstringlist.h>
+
+#include <math.h>
+
+#ifndef Q_WS_WIN
+# include <time.h>
+# include <sys/time.h>
+#else
+# include <windows.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+namespace QScript {
+
+qsreal ToInteger(qsreal n);
+
+static const qsreal HoursPerDay = 24.0;
+static const qsreal MinutesPerHour = 60.0;
+static const qsreal SecondsPerMinute = 60.0;
+static const qsreal msPerSecond = 1000.0;
+static const qsreal msPerMinute = 60000.0;
+static const qsreal msPerHour = 3600000.0;
+static const qsreal msPerDay = 86400000.0;
+
+static qsreal LocalTZA = 0.0; // initialized at startup
+
+static inline qsreal TimeWithinDay(qsreal t)
+{
+ qsreal r = ::fmod(t, msPerDay);
+ return (r >= 0) ? r : r + msPerDay;
+}
+
+static inline int HourFromTime(qsreal t)
+{
+ int r = int(::fmod(::floor(t / msPerHour), HoursPerDay));
+ return (r >= 0) ? r : r + int(HoursPerDay);
+}
+
+static inline int MinFromTime(qsreal t)
+{
+ int r = int(::fmod(::floor(t / msPerMinute), MinutesPerHour));
+ return (r >= 0) ? r : r + int(MinutesPerHour);
+}
+
+static inline int SecFromTime(qsreal t)
+{
+ int r = int(::fmod(::floor(t / msPerSecond), SecondsPerMinute));
+ return (r >= 0) ? r : r + int(SecondsPerMinute);
+}
+
+static inline int msFromTime(qsreal t)
+{
+ int r = int(::fmod(t, msPerSecond));
+ return (r >= 0) ? r : r + int(msPerSecond);
+}
+
+static inline qsreal Day(qsreal t)
+{
+ return ::floor(t / msPerDay);
+}
+
+static inline qsreal DaysInYear(qsreal y)
+{
+ if (::fmod(y, 4))
+ return 365;
+
+ else if (::fmod(y, 100))
+ return 366;
+
+ else if (::fmod(y, 400))
+ return 365;
+
+ return 366;
+}
+
+static inline qsreal DayFromYear(qsreal y)
+{
+ return 365 * (y - 1970)
+ + ::floor((y - 1969) / 4)
+ - ::floor((y - 1901) / 100)
+ + ::floor((y - 1601) / 400);
+}
+
+static inline qsreal TimeFromYear(qsreal y)
+{
+ return msPerDay * DayFromYear(y);
+}
+
+static inline qsreal YearFromTime(qsreal t)
+{
+ int y = 1970;
+ y += (int) ::floor(t / (msPerDay * 365.2425));
+
+ qsreal t2 = TimeFromYear(y);
+ return (t2 > t) ? y - 1 : ((t2 + msPerDay * DaysInYear(y)) <= t) ? y + 1 : y;
+}
+
+static inline bool InLeapYear(qsreal t)
+{
+ qsreal x = DaysInYear(YearFromTime(t));
+ if (x == 365)
+ return 0;
+
+ Q_ASSERT (x == 366);
+ return 1;
+}
+
+static inline qsreal DayWithinYear(qsreal t)
+{
+ return Day(t) - DayFromYear(YearFromTime(t));
+}
+
+static inline qsreal MonthFromTime(qsreal t)
+{
+ qsreal d = DayWithinYear(t);
+ qsreal l = InLeapYear(t);
+
+ if (d < 31.0)
+ return 0;
+
+ else if (d < 59.0 + l)
+ return 1;
+
+ else if (d < 90.0 + l)
+ return 2;
+
+ else if (d < 120.0 + l)
+ return 3;
+
+ else if (d < 151.0 + l)
+ return 4;
+
+ else if (d < 181.0 + l)
+ return 5;
+
+ else if (d < 212.0 + l)
+ return 6;
+
+ else if (d < 243.0 + l)
+ return 7;
+
+ else if (d < 273.0 + l)
+ return 8;
+
+ else if (d < 304.0 + l)
+ return 9;
+
+ else if (d < 334.0 + l)
+ return 10;
+
+ else if (d < 365.0 + l)
+ return 11;
+
+ return qSNaN(); // ### assert?
+}
+
+static inline qsreal DateFromTime(qsreal t)
+{
+ int m = (int) ToInteger(MonthFromTime(t));
+ qsreal d = DayWithinYear(t);
+ qsreal l = InLeapYear(t);
+
+ switch (m) {
+ case 0: return d + 1.0;
+ case 1: return d - 30.0;
+ case 2: return d - 58.0 - l;
+ case 3: return d - 89.0 - l;
+ case 4: return d - 119.0 - l;
+ case 5: return d - 150.0 - l;
+ case 6: return d - 180.0 - l;
+ case 7: return d - 211.0 - l;
+ case 8: return d - 242.0 - l;
+ case 9: return d - 272.0 - l;
+ case 10: return d - 303.0 - l;
+ case 11: return d - 333.0 - l;
+ }
+
+ return qSNaN(); // ### assert
+}
+
+static inline qsreal WeekDay(qsreal t)
+{
+ qsreal r = ::fmod (Day(t) + 4.0, 7.0);
+ return (r >= 0) ? r : r + 7.0;
+}
+
+
+static inline qsreal MakeTime(qsreal hour, qsreal min, qsreal sec, qsreal ms)
+{
+ return ((hour * MinutesPerHour + min) * SecondsPerMinute + sec) * msPerSecond + ms;
+}
+
+static inline qsreal DayFromMonth(qsreal month, qsreal leap)
+{
+ switch ((int) month) {
+ case 0: return 0;
+ case 1: return 31.0;
+ case 2: return 59.0 + leap;
+ case 3: return 90.0 + leap;
+ case 4: return 120.0 + leap;
+ case 5: return 151.0 + leap;
+ case 6: return 181.0 + leap;
+ case 7: return 212.0 + leap;
+ case 8: return 243.0 + leap;
+ case 9: return 273.0 + leap;
+ case 10: return 304.0 + leap;
+ case 11: return 334.0 + leap;
+ }
+
+ return qSNaN(); // ### assert?
+}
+
+static qsreal MakeDay(qsreal year, qsreal month, qsreal day)
+{
+ year += ::floor(month / 12.0);
+
+ month = ::fmod(month, 12.0);
+ if (month < 0)
+ month += 12.0;
+
+ qsreal t = TimeFromYear(year);
+ qsreal leap = InLeapYear(t);
+
+ day += ::floor(t / msPerDay);
+ day += DayFromMonth(month, leap);
+
+ return day - 1;
+}
+
+static inline qsreal MakeDate(qsreal day, qsreal time)
+{
+ return day * msPerDay + time;
+}
+
+static inline qsreal DaylightSavingTA(double t)
+{
+#ifndef Q_WS_WIN
+ long int tt = (long int)(t / msPerSecond);
+ struct tm *tmtm = localtime((const time_t*)&tt);
+ if (! tmtm)
+ return 0;
+ return (tmtm->tm_isdst > 0) ? msPerHour : 0;
+#else
+ Q_UNUSED(t);
+ /// ### implement me
+ return 0;
+#endif
+}
+
+static inline qsreal LocalTime(qsreal t)
+{
+ return t + LocalTZA + DaylightSavingTA(t);
+}
+
+static inline qsreal UTC(qsreal t)
+{
+ return t - LocalTZA - DaylightSavingTA(t - LocalTZA);
+}
+
+static inline qsreal currentTime()
+{
+#ifndef Q_WS_WIN
+ struct timeval tv;
+
+ gettimeofday(&tv, 0);
+ return ::floor(tv.tv_sec * msPerSecond + (tv.tv_usec / 1000.0));
+#else
+ SYSTEMTIME st;
+ GetSystemTime(&st);
+ FILETIME ft;
+ SystemTimeToFileTime(&st, &ft);
+ LARGE_INTEGER li;
+ li.LowPart = ft.dwLowDateTime;
+ li.HighPart = ft.dwHighDateTime;
+ return double(li.QuadPart - Q_INT64_C(116444736000000000)) / 10000.0;
+#endif
+}
+
+static inline qsreal TimeClip(qsreal t)
+{
+ if (! qIsFinite(t) || fabs(t) > 8.64e15)
+ return qSNaN();
+ return ToInteger(t);
+}
+
+static inline qsreal ParseString(const QString &s)
+{
+ QDateTime dt = QDateTime::fromString(s, Qt::TextDate);
+ if (!dt.isValid())
+ dt = QDateTime::fromString(s, Qt::ISODate);
+ if (!dt.isValid()) {
+ QStringList formats;
+ formats << QLatin1String("M/d/yyyy")
+ << QLatin1String("M/d/yyyy hh:mm")
+ << QLatin1String("M/d/yyyy hh:mm A")
+
+ << QLatin1String("M/d/yyyy, hh:mm")
+ << QLatin1String("M/d/yyyy, hh:mm A")
+
+ << QLatin1String("MMM d yyyy")
+ << QLatin1String("MMM d yyyy hh:mm")
+ << QLatin1String("MMM d yyyy hh:mm:ss")
+ << QLatin1String("MMM d yyyy, hh:mm")
+ << QLatin1String("MMM d yyyy, hh:mm:ss")
+
+ << QLatin1String("MMMM d yyyy")
+ << QLatin1String("MMMM d yyyy hh:mm")
+ << QLatin1String("MMMM d yyyy hh:mm:ss")
+ << QLatin1String("MMMM d yyyy, hh:mm")
+ << QLatin1String("MMMM d yyyy, hh:mm:ss")
+
+ << QLatin1String("MMM d, yyyy")
+ << QLatin1String("MMM d, yyyy hh:mm")
+ << QLatin1String("MMM d, yyyy hh:mm:ss")
+
+ << QLatin1String("MMMM d, yyyy")
+ << QLatin1String("MMMM d, yyyy hh:mm")
+ << QLatin1String("MMMM d, yyyy hh:mm:ss")
+
+ << QLatin1String("d MMM yyyy")
+ << QLatin1String("d MMM yyyy hh:mm")
+ << QLatin1String("d MMM yyyy hh:mm:ss")
+ << QLatin1String("d MMM yyyy, hh:mm")
+ << QLatin1String("d MMM yyyy, hh:mm:ss")
+
+ << QLatin1String("d MMMM yyyy")
+ << QLatin1String("d MMMM yyyy hh:mm")
+ << QLatin1String("d MMMM yyyy hh:mm:ss")
+ << QLatin1String("d MMMM yyyy, hh:mm")
+ << QLatin1String("d MMMM yyyy, hh:mm:ss")
+
+ << QLatin1String("d MMM, yyyy")
+ << QLatin1String("d MMM, yyyy hh:mm")
+ << QLatin1String("d MMM, yyyy hh:mm:ss")
+
+ << QLatin1String("d MMMM, yyyy")
+ << QLatin1String("d MMMM, yyyy hh:mm")
+ << QLatin1String("d MMMM, yyyy hh:mm:ss");
+
+ for (int i = 0; i < formats.size(); ++i) {
+ dt = QDateTime::fromString(s, formats.at(i));
+ if (dt.isValid())
+ break;
+ }
+ }
+ return FromDateTime(dt);
+}
+
+static inline QString ToString(qsreal t)
+{
+ if (qIsNaN(t))
+ return QLatin1String("Invalid Date");
+ QString str = ToDateTime(t, Qt::LocalTime).toString() + QLatin1String(" GMT");
+ qsreal tzoffset = LocalTZA + DaylightSavingTA(t);
+ if (tzoffset) {
+ int hours = tzoffset / 1000 / 60 / 60;
+ int mins = int(tzoffset / 1000 / 60) % 60;
+ str.append(QLatin1Char((tzoffset > 0) ? '+' : '-'));
+ if (hours < 10)
+ str.append(QLatin1Char('0'));
+ str.append(QString::number(hours));
+ if (mins < 10)
+ str.append(QLatin1Char('0'));
+ str.append(QString::number(mins));
+ }
+ return str;
+}
+
+static inline QString ToUTCString(qsreal t)
+{
+ if (qIsNaN(t))
+ return QLatin1String("Invalid Date");
+ return ToDateTime(t, Qt::UTC).toString() + QLatin1String(" GMT");
+}
+
+static inline QString ToDateString(qsreal t)
+{
+ return ToDateTime(t, Qt::LocalTime).date().toString();
+}
+
+static inline QString ToTimeString(qsreal t)
+{
+ return ToDateTime(t, Qt::LocalTime).time().toString();
+}
+
+static inline QString ToLocaleString(qsreal t)
+{
+ return ToDateTime(t, Qt::LocalTime).toString(Qt::LocaleDate);
+}
+
+static inline QString ToLocaleDateString(qsreal t)
+{
+ return ToDateTime(t, Qt::LocalTime).date().toString(Qt::LocaleDate);
+}
+
+static inline QString ToLocaleTimeString(qsreal t)
+{
+ return ToDateTime(t, Qt::LocalTime).time().toString(Qt::LocaleDate);
+}
+
+static qsreal getLocalTZA()
+{
+#ifndef Q_WS_WIN
+ struct tm* t;
+ time_t curr;
+ time(&curr);
+ t = localtime(&curr);
+ time_t locl = mktime(t);
+ t = gmtime(&curr);
+ time_t globl = mktime(t);
+ return double(locl - globl) * 1000.0;
+#else
+ TIME_ZONE_INFORMATION tzInfo;
+ GetTimeZoneInformation(&tzInfo);
+ return -tzInfo.Bias * 60.0 * 1000.0;
+#endif
+}
+
+/*!
+ \internal
+
+ Converts the QDateTime \dt to an ECMA Date value (in UTC form).
+*/
+qsreal FromDateTime(const QDateTime &dt)
+{
+ if (!dt.isValid())
+ return qSNaN();
+ if (!LocalTZA) // ### move
+ LocalTZA = getLocalTZA();
+ QDate date = dt.date();
+ QTime taim = dt.time();
+ int year = date.year();
+ int month = date.month() - 1;
+ int day = date.day();
+ int hours = taim.hour();
+ int mins = taim.minute();
+ int secs = taim.second();
+ int ms = taim.msec();
+ double t = MakeDate(MakeDay(year, month, day),
+ MakeTime(hours, mins, secs, ms));
+ if (dt.timeSpec() == Qt::LocalTime)
+ t = UTC(t);
+ return TimeClip(t);
+}
+
+/*!
+ \internal
+
+ Converts the ECMA Date value \tt (in UTC form) to QDateTime
+ according to \a spec.
+*/
+QDateTime ToDateTime(qsreal t, Qt::TimeSpec spec)
+{
+ if (qIsNaN(t))
+ return QDateTime();
+ if (!LocalTZA) // ### move
+ LocalTZA = getLocalTZA();
+ if (spec == Qt::LocalTime)
+ t = LocalTime(t);
+ int year = int(YearFromTime(t));
+ int month = int(MonthFromTime(t) + 1);
+ int day = int(DateFromTime(t));
+ int hours = HourFromTime(t);
+ int mins = MinFromTime(t);
+ int secs = SecFromTime(t);
+ int ms = msFromTime(t);
+ return QDateTime(QDate(year, month, day), QTime(hours, mins, secs, ms), spec);
+}
+
+} // namespace QScript
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
diff --git a/src/script/utils/qscriptdate_p.h b/src/script/utils/qscriptdate_p.h
new file mode 100644
index 0000000..94b30cb
--- /dev/null
+++ b/src/script/utils/qscriptdate_p.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the $MODULE$ of the Qt Toolkit.
+**
+** $TROLLTECH_DUAL_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSCRIPTDATE_P_H
+#define QSCRIPTDATE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qdatetime.h>
+
+#ifndef QT_NO_SCRIPT
+
+QT_BEGIN_NAMESPACE
+
+typedef double qsreal;
+
+namespace QScript
+{
+ qsreal FromDateTime(const QDateTime &dt);
+ QDateTime ToDateTime(qsreal t, Qt::TimeSpec spec);
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_SCRIPT
+
+#endif
diff --git a/src/script/utils/utils.pri b/src/script/utils/utils.pri
new file mode 100644
index 0000000..d8302d5
--- /dev/null
+++ b/src/script/utils/utils.pri
@@ -0,0 +1,5 @@
+SOURCES += \
+ $$PWD/qscriptdate.cpp
+
+HEADERS += \
+ $$PWD/qscriptdate_p.h
diff --git a/src/script/qscriptprettypretty.cpp b/src/script/visitors/qscriptprettypretty.cpp
index b221b0a..06faac9 100644
--- a/src/script/qscriptprettypretty.cpp
+++ b/src/script/visitors/qscriptprettypretty.cpp
@@ -1,41 +1,11 @@
/****************************************************************************
**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
** Contact: Qt Software Information (qt-info@nokia.com)
**
-** This file is part of the QtScript module of the Qt Toolkit.
+** This file is part of the $MODULE$ of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at qt-sales@nokia.com.
-** $QT_END_LICENSE$
+** $TROLLTECH_DUAL_LICENSE$
**
****************************************************************************/
@@ -43,12 +13,7 @@
#ifndef QT_NO_SCRIPT
-#include "qscriptengine_p.h"
-#include "qscriptvalueimpl_p.h"
-#include "qscriptcontext_p.h"
-#include "qscriptmember_p.h"
-#include "qscriptobject_p.h"
-#include "qscriptast_p.h"
+#include "../parser/qscriptast_p.h"
#include <QtCore/QString>
#include <QtCore/QTextStream>
@@ -56,6 +21,8 @@
QT_BEGIN_NAMESPACE
+typedef double qsreal; // ###
+
namespace QScript {
QString numberToString(qsreal value);
}
@@ -182,7 +149,8 @@ void PrettyPretty::endVisit(AST::ThisExpression *node)
bool PrettyPretty::visit(AST::IdentifierExpression *node)
{
- out << QScriptEnginePrivate::toString(node->name);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << QScriptEnginePrivate::toString(node->name);
return true;
}
@@ -229,9 +197,10 @@ void PrettyPretty::endVisit(AST::FalseLiteral *node)
bool PrettyPretty::visit(AST::StringLiteral *node)
{
- QString lit = QScriptEnginePrivate::toString(node->value);
- lit.replace(QLatin1Char('\\'), QLatin1String("\\\\"));
- out << '\"' << lit << '\"';
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+ QString lit = QString(); // QScriptEnginePrivate::toString(node->value);
+ lit.replace(QLatin1String("\\"), QLatin1String("\\\\"));
+ out << "\"" << lit << "\"";
return false;
}
@@ -242,7 +211,8 @@ void PrettyPretty::endVisit(AST::StringLiteral *node)
bool PrettyPretty::visit(AST::NumericLiteral *node)
{
- out << QScript::numberToString(node->value);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << QScript::numberToString(node->value);
return true;
}
@@ -253,9 +223,10 @@ void PrettyPretty::endVisit(AST::NumericLiteral *node)
bool PrettyPretty::visit(AST::RegExpLiteral *node)
{
- out << '/' << QScriptEnginePrivate::toString(node->pattern) << '/';
- if (node->flags)
- out << QScript::Ecma::RegExp::flagsToString(node->flags);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << "/" << QScriptEnginePrivate::toString(node->pattern) << "/";
+// if (node->flags)
+// out << QScript::Ecma::RegExp::flagsToString(node->flags);
return true;
}
@@ -348,7 +319,8 @@ void PrettyPretty::endVisit(AST::PropertyNameAndValueList *node)
bool PrettyPretty::visit(AST::IdentifierPropertyName *node)
{
- out << QScriptEnginePrivate::toString(node->id);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << QScriptEnginePrivate::toString(node->id);
return false;
}
@@ -359,9 +331,10 @@ void PrettyPretty::endVisit(AST::IdentifierPropertyName *node)
bool PrettyPretty::visit(AST::StringLiteralPropertyName *node)
{
- QString lit = QScriptEnginePrivate::toString(node->id);
- lit.replace(QLatin1String("\\"), QLatin1String("\\\\"));
- out << lit;
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// QString lit = QScriptEnginePrivate::toString(node->id);
+// lit.replace(QLatin1String("\\"), QLatin1String("\\\\"));
+// out << lit;
return false;
}
@@ -398,7 +371,8 @@ void PrettyPretty::endVisit(AST::ArrayMemberExpression *node)
bool PrettyPretty::visit(AST::FieldMemberExpression *node)
{
accept(node->base);
- out << '.' << QScriptEnginePrivate::toString(node->name);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << "." << QScriptEnginePrivate::toString(node->name);
return false;
}
@@ -803,7 +777,8 @@ void PrettyPretty::endVisit(AST::VariableStatement *node)
bool PrettyPretty::visit(AST::VariableDeclaration *node)
{
- out << QScriptEnginePrivate::toString(node->name);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << QScriptEnginePrivate::toString(node->name);
if (node->expression) {
out << " = ";
accept(node->expression);
@@ -959,7 +934,8 @@ bool PrettyPretty::visit(AST::ContinueStatement *node)
{
out << "continue";
if (node->label) {
- out << ' ' << QScriptEnginePrivate::toString(node->label);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << " " << QScriptEnginePrivate::toString(node->label);
}
out << ';';
return false;
@@ -974,7 +950,8 @@ bool PrettyPretty::visit(AST::BreakStatement *node)
{
out << "break";
if (node->label) {
- out << ' ' << QScriptEnginePrivate::toString(node->label);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << " " << QScriptEnginePrivate::toString(node->label);
}
out << ';';
return false;
@@ -1095,7 +1072,8 @@ void PrettyPretty::endVisit(AST::DefaultClause *node)
bool PrettyPretty::visit(AST::LabelledStatement *node)
{
- out << QScriptEnginePrivate::toString(node->label) << ": ";
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << QScriptEnginePrivate::toString(node->label) << ": ";
return true;
}
@@ -1123,7 +1101,8 @@ bool PrettyPretty::visit(AST::TryStatement *node)
out << "try ";
acceptAsBlock(node->statement);
if (node->catchExpression) {
- out << " catch (" << QScriptEnginePrivate::toString(node->catchExpression->name) << ") ";
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// out << " catch (" << QScriptEnginePrivate::toString(node->catchExpression->name) << ") ";
acceptAsBlock(node->catchExpression->statement);
}
if (node->finallyExpression) {
@@ -1165,14 +1144,16 @@ bool PrettyPretty::visit(AST::FunctionDeclaration *node)
{
out << "function";
- if (node->name)
- out << ' ' << QScriptEnginePrivate::toString(node->name);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// if (node->name)
+// out << " " << QScriptEnginePrivate::toString(node->name);
// the arguments
out << '(';
for (AST::FormalParameterList *it = node->formals; it; it = it->next) {
- if (it->name)
- out << QScriptEnginePrivate::toString(it->name);
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
+// if (it->name)
+// out << QScriptEnginePrivate::toString(it->name);
if (it->next)
out << ", ";
@@ -1202,16 +1183,17 @@ void PrettyPretty::endVisit(AST::FunctionDeclaration *node)
bool PrettyPretty::visit(AST::FunctionExpression *node)
{
+ Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented");
out << "function";
- if (node->name)
- out << ' ' << QScriptEnginePrivate::toString(node->name);
+// if (node->name)
+// out << " " << QScriptEnginePrivate::toString(node->name);
// the arguments
out << '(';
for (AST::FormalParameterList *it = node->formals; it; it = it->next) {
- if (it->name)
- out << QScriptEnginePrivate::toString(it->name);
+// if (it->name)
+// out << QScriptEnginePrivate::toString(it->name);
if (it->next)
out << ", ";
diff --git a/src/script/qscriptprettypretty_p.h b/src/script/visitors/qscriptprettypretty_p.h